一、TCP(面向连接的通信)
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分客户端(Client)和服务器(Server)。
二、通信步骤(通信原理)
- 服务器端先启动
- 客户端请求–>服务器端
- 客户端< – >服务器端【逻辑连接(有一个对象)】
- 逻辑连接含有客户端提供的**
IO对象
**(字节流对象)
** IO对象
**
TCP连接的示意图:
- 服务器必须明确和哪个客户端交互,而且需要多个IO流对象。
- 服务器端方法 **
accpet
**,客户端获取 –> 客户端对象。
- 服务器(没有IO流) –> 服务器获取请求客户端对象Socket
- (服务器用的客户端的IO流交互)
- 服务器使用客户端的字节输入流(读取)客户端发送的数据
- 服务器使用客户端的字节输出流(回写)给客户端数据
Server(服务器)
1 2 3 4
| 1.指定端口 使用ServerSocket创建服务器 2.阻塞式等待连接accept 3.操作:使用输入输出流操作 4.释放资源
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args)throws IOException { System.out.println("----Server(服务器)----"); //1.指定端口 使用ServerSocket创建服务器 ServerSocket server=new ServerSocket(8088); //2.阻塞式等待连接accept Socket client=server.accept(); System.out.println("一个客户端建立了连接"); //3.操作:使用输入输出流操作 DataInputStream shuru=new DataInputStream(client.getInputStream());/用DataInputStream输入流 String data=shuru.readUTF();//输入 //4.释放资源 shuru.close();//释放shuru client.close();//释放Client server.close();//释放server服务器对象 } }
|
Client(客户端)
1 2 3
| 1.建立连接:使用Socket建立窗户段+服务的地址和端口 2.第一步连接好了直接操作:使用输入输出流操作 3.释放资源
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException{ System.out.println("----Client(客户端)----"); //1.建立连接:使用Socket建立窗户段+服务的地址和端口 Socket client=new Socket("localhost",8088);//创建client对象去接收服务器的东西 //2.第一步连接好了直接操作:使用输入输出流操作 DataOutputStream shuchu=new DataOutputStream(client.getOutputStream());//用DataOutputStream输出流 String data="hello";//输出一个字符串 hello shuchu.writeUTF(data);//shuchu写入 shuchu.flush(); //3.释放资源 shuchu.close();//释放输出 client.close(); //释放client对象 } }
|
三、TCP文件上传
在前面的基础上只需要将传输的数据做更改即可达到单向传输!
Client(客户端)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException{ System.out.println("----Client(客户端)----"); BufferedReader console=new BufferedReader(new InputStreamReader(System.in));//用BufferedReader类型去创建输入用户名和密码 System.out.println("请输入用户名"); String uname=console.readLine(); System.out.println("请输入密码"); String upassword=console.readLine(); //1.建立连接:使用Socket建立窗户段+服务的地址和端口 Socket client=new Socket("localhost",8088); //2.第一步连接好了直接操作:使用输入输出流操作 DataOutputStream shuchu=new DataOutputStream(client.getOutputStream());//输 shuchu.writeUTF("uname="+uname+"&"+"upassword="+upassword); shuchu.flush(); //3.释放资源 shuchu.close(); client.close(); } }
|
Server(服务器)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args)throws IOException { System.out.println("----Server(服务器)----"); //1.指定端口 使用ServerSocket创建服务器 ServerSocket server=new ServerSocket(8088); //2.阻塞式等待连接accept Socket client=server.accept(); System.out.println("一个客户端建立了连接"); //3.操作:使用输入输出流操作 DataInputStream shuru=new DataInputStream(client.getInputStream());//输入流 String datas=shuru.readUTF(); //分析数据 String[] dataArray=datas.split("&");//用&分割 for(String info:dataArray)//增强型for循环输出 { String[] userinfo=info.split("="); System.out.println(userinfo[0]+"-->"+userinfo[1]); }
//4.释放资源 shuru.close(); client.close(); server.close(); } }
|
代码结果如下:
客户端的截图:
服务器的截图: