一. DatagramPacket
在《Socket:基于TCP的Socket通信以及使用多线程实现多客户端的通信》一文中,我们讲解了如何基于TCP协议进行socket编程,接下来讲解基于UDP的socket编程。
UDP协议(用户数据报协议)是无连接、不可靠的、无序的,以数据报作为数据传输的载体,速度较快。
UDP进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去。相关的操作类:
-
DatagramPacket:表示数据报包
-
DatagramSocket:进行端到端通信的类
二. 基于UDP的Socket通信服务器端
想要基于UDP进行Socket通信,服务端需要做的事情大概有以下几步
-
创建DatagramSocket,指定端口号
-
创建DatagramPacket
-
接收客户端发送的数据信息
-
读取数据
上面的步骤所对应的代码:
package com.example.sockettest.server; import com.example.thread.ServerThread; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * @Author : ZhangJia * @Date : 13:55 * @Description : */ public class Server { public static void main(String[] args) { //1.创建ServerSocket对象,绑定监听端口 try { ServerSocket serverSocket = new ServerSocket(8887); int count = 0; //记录客户端的数量 System.out.println("服务器即将启动,等待客户端连接"); Socket socket = null; //循环监听等待客户端的连接 while (true) { // 通过accept()方法监听客户端请求 socket = serverSocket.accept(); // 创建一个新的线程 ServerThread serverThread = new ServerThread(socket); // 启动线程 serverThread.start(); System.out.println("当前客户端的数量是" + ++count); System.out.println("当前客户端计算机名" + socket.getInetAddress().getHostName()); System.out.println("当前客户端IP" + socket.getInetAddress().getHostAddress()); System.out.println("-------------------"); } } catch (IOException e) { e.printStackTrace(); } } }
接下来启动服务器端,服务器端的控制台输出:
服务器即将启动,等待客户端连接
三. 基于UDP的Socket通信客户端
想要基于UDP进行Socket通信,客户端需要做的事情大概有以下几步
-
定义发送信息
-
创建DatagramPacket,包含将要发送的信息
-
创建DatagramSocket
-
发送数据
上面的步骤所对应的代码:
package com.example.sockettest.client; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.UnknownHostException; /** * @Author : ZhangJia * @Date : 16:27 * @Description : */ public class UDPClient { public static void main(String[] args) { try { /* * 发送数据给服务器端 * * */ //1. 定义服务器的地址、端口号、数据 InetAddress address = InetAddress.getByName("localhost"); int port = 8887; byte[] data = "你好,我是ZhangJia".getBytes(); //2. 创建数据报,包含发送的数据信息 DatagramPacket packet = new DatagramPacket(data, data.length, address, port); //3. 创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); //4. 向服务器端发送数据报 socket.send(packet); /* * 接受服务器端发送的数据 * * */ //1. 创建数据报,用于接收服务器端发送的数据 byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, data2.length); //2. 接受客户端发送的数据 socket.receive(packet2);//此方法在接收到数据报之前会一直堵塞 //3. 读取数据 String info = new String(data2,0,packet2.getLength()); System.out.println("我是客户器端,服务器端发送的消息是:" + info); //4. 关闭资源 socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
接下来启动客户端,服务器端的控制台输出(注意,此时第二节启动的服务器端还没有关闭):
服务器即将启动,等待客户端连接 我是服务器,客户端发送的消息是你好,我是ZhangJia
而客户端的控制台输出:
我是客户器端,服务器端发送的消息是:我已经收到您发送的数据
参考资料
本文所有内容根据慕课网汤小洋老师:Java Socket应用—通信是这样练成的 教程整理而成
请登录之后再进行评论