在上一篇中,使用了 java Socket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信。
1. 关于UDP
UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快,进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去,Java 对UDP 协议通信提供了两个主要的类,DatagramPacket类:表示数据报包,DatagramSocket类:进行端到端通信的类。
2. 实现方法
2.1 服务器端
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket
- 接受客户端发送的数据信息
- 读取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //服务器端,实现基于UDP的用户登录 //1、创建服务器端DatagramSocket,指定端口 DatagramSocket socket = new datagramSocket( 10010 ); //2、创建数据报,用于接受客户端发送的数据 byte [] data =newbyte[ 1024 ]; // DatagramPacket packet =newDatagramPacket(data,data.length); //3、接受客户端发送的数据 socket.receive(packet); //此方法在接受数据报之前会一致阻塞 //4、读取数据 String info =newString(data,o,data.length); System.out.println( "Hello,我是服务器,客户端告诉我" +info); //========================================================= //向客户端响应数据 //1、定义客户端的地址、端口号、数据 InetAddress address = packet.getAddress(); int port = packet.getPort(); byte [] data2 = "欢迎您!" .geyBytes(); //2、创建数据报,包含响应的数据信息 DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port); //3、响应客户端 socket.send(packet2); //4、关闭资源 socket.close(); |
2.2 客户端
- 定义发送信息
- 创建DatagramPacket,包含将要发送的信息
- 创建DatagramSocket
- 发送数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //客户端 //1、定义服务器的地址、端口号、数据 InetAddress address =InetAddress.getByName( "localhost" ); int port = 10010 ; byte [] data = "用户名:admin;密码:123" .getBytes(); //2、创建数据报,包含发送的数据信息 DatagramPacket packet = newDatagramPacket(data,data,length,address,port); //3、创建DatagramSocket对象 DatagramSocket socket =newDatagramSocket(); //4、向服务器发送数据 socket.send(packet); //接受服务器端响应数据 //====================================== //1、创建数据报,用于接受服务器端响应数据 byte [] data2 = new byte [ 1024 ]; DatagramPacket packet2 = new DatagramPacket(data2,data2.length); //2、接受服务器响应的数据 socket.receive(packet2); String raply = new String(data2, 0 ,packet2.getLenth()); System.out.println( "我是客户端,服务器说:" +reply); //4、关闭资源 socket.close(); |
3. 注意问题
- 多线程的优先级问题:根据实际的经验,适当的降低优先级,否侧可能会有程序运行效率低的情况
- 是否关闭输出流和输入流:对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可
- 使用TCP通信传输对象,IO中序列化部分
- socket编程传递文件,IO流部分
参考资料:
http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步