网络通信协议:
协议
tcp:
//服务器 ServerSocket server = new ServerSocket(9999); //获取监听:监听是否有客户端的通讯要求接入 while(true){ Socket socket = null; try { socket = server.accept();//每次循环结束后,都会获取新的监听 //接收 DataInputStream in = new DataInputStream(socket.getInputStream()); String msg = in.readUTF(); System.out.println("服务器接收:"+msg); //发送 DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.print("请输入:"); out.writeUTF(scanner.nextLine()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if(socket != null){ socket.close(); } } }
Scanner scanner = new Scanner(System.in); while(true){ //客户端 Socket socket = null; try { //发送 socket = new Socket(InetAddress.getByName("localhost").getHostAddress(), 9999); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); System.out.print("请输入:"); out.writeUTF(scanner.nextLine()); //接收 DataInputStream in = new DataInputStream(socket.getInputStream()); String msg = in.readUTF(); System.out.println("客户端接收:"+msg); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
TCP标志位:
TCP三次握手:
- 客户端向服务器发送一次请求:SYN,seq number
- 服务器接收到客户端的连接请求后,会再次向客户端发起一次请求
- 客户端接收到服务器确认连接的请求后,会再次响应服务器一个确认连接
TCP四次挥手:
- 客户端通知服务器,我的数据传完了,我要关闭连接
- 服务器响应,确认关闭连接
- 向客户端发送关闭连接的请求
- 客户端响应,确认关闭连接
udp: 是一种发送后没有响应的一种请求。可用于心跳检测
特点:
- 无需响应
- 对数据安全要求不高
- 传送效率高
- 占用资源少
//发送udp数据 //创建DatagramSocket对象,绑定端口3456 DatagramSocket sendSocket = new DatagramSocket(3456); //准备好要发送的数据,类型为byte[] String string = "Hello,I come form ICSS!"; byte[] databyte = new byte[100]; databyte = string.getBytes(); //创建数据报,封装了要发送的数据,数据长度,服务器地址,以及服务器端口为5000 DatagramPacket sendPacket = new DatagramPacket(databyte, string.length(), InetAddress.getByName("127.0.0.1"), 5000); //使用DatagramSocket对象将数据报sendPacket发送到服务器 sendSocket.send(sendPacket); System.out.println("发送数据:" + string);
//接收udp数据 //创建DatagramSocket对象,用来接收数据,端口为5000 DatagramSocket receiveSocket = new DatagramSocket(5000); byte buf[] = new byte[1000]; DatagramPacket receivePacket = new DatagramPacket(buf, buf.length); System.out.println("startinig to receive packet"); while (true) { //使用DatagramSocket接收数据报 receiveSocket.receive(receivePacket); //解析数据报中的信息,获得主机名及端口、数据等 String name = receivePacket.getAddress().toString(); System.out.println("来自主机:" + name + "端口:"+ receivePacket.getPort()); String s = new String(receivePacket.getData(), 0, receivePacket.getLength()); System.out.println("接收数据: " + s); }




