java网络编程
-
网络通信协议:
OSI参考模型 TCP/IP参考模型 TCP/IP参考模型各层对应协议 应用层 应用层 HTTP、ftp、telnet、DNS… 表示层 应用层 会话层 应用层 传输层 传输层 TCP、UDP、… 网络层 网络层 IP、ICMP、ARP… 数据链路层 数据链路层 Link 物理层 物理 -
协议
** ** TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠 不可靠 速度 慢 快 -
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标志位:
示例 说明 SYN synchronous建立联机 ACK acknowledgement确认 PSH push传送 FIN finish结束 RST reset重置 URG urgent紧急 Sequence number 顺序号码 Acknowledge number 确认号码 -
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); }