java UDP多线程回射服务器

来源:互联网 发布:社区门诊软件 编辑:程序博客网 时间:2024/06/06 10:00


UDP协议简介

UDP是一种无连接的通信协议,提供不可靠的信息传输服务,该协议工作于计算机网络中的传输层。

由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

UDP协议的主要作用是将网络数据流量压缩成数据包形式。

.UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。


UDP通信流程

由于udp是无连接的通信,所以通信过程中不需要像TCP协议中的监听(listen),接待(accept)。


下面是一个基于java语言实现的UDP通信模型

package com.server;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * * Udp多线程回射服务器 */class UdpServerThread extends Thread{private DatagramSocket socket;//private byte[] infoBytes;String info = null;private int port;InetAddress ip;public UdpServerThread(DatagramPacket packet, DatagramSocket socket, byte[] infoBytes) {this.socket = socket;this.info = new String(infoBytes, 0, packet.getLength());this.port = packet.getPort();this.ip = packet.getAddress();}@Overridepublic void run() {super.run();//打印消息System.out.println("客户端-"+ ip + " port=" + port + "说:"+info);//回射byte[] echobuf = ("server:"+info).getBytes();DatagramPacket packet2 = new DatagramPacket(echobuf, echobuf.length, ip, port);try {socket.send(packet2);}catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}public class Server2{private static final int PORT = 9960;public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(PORT);byte[] infoBytes = new byte[1024];System.out.println("Server is running...");while(true) {DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length);socket.receive(packet);//接收数据包//阻塞函数//接收到一个包就就开启一个线程UdpServerThread thread = new UdpServerThread(packet, socket, infoBytes);thread.start();}}}


客户端

package com.client;//package com.client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * Udp客户端 */public class Client2 {//enum PORT{one,two,three}private final static int PORT = 9960; //通信端口要与服务器端一致public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//创建套接字DatagramSocket client = new DatagramSocket();BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); InetAddress ip = InetAddress.getByName("127.0.0.1");//使用本机ip地址//创建数据包//DatagramPacket(byte[] buf, int length, InetAddress address, int port) //client.connect(ip,PORT);String buf = null;while((buf = in.readLine()) !=null) {//创建数据包byte[] sendbuf =  buf.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendbuf, sendbuf.length,ip,PORT);client.send(sendPacket);//阻塞函数//接收服务器端发来的消息byte[] recvbuf = new byte[256];DatagramPacket recvPacket = new DatagramPacket(recvbuf, recvbuf.length);client.receive(recvPacket);byte[] buf2 = recvPacket.getData();int len = recvPacket.getLength();String result = new String(buf2, 0, len);System.out.println("发送了:" + result);if("exit".equals(buf))break;}client.close();     //关闭套接字in.close();}}

打开服务器,同时运行2个客户端程序并发送数据
运行结果:

Server is running...
客户端-/192.168.4.109 port=64517说:111
客户端-/192.168.4.109 port=64518说:222
客户端-/192.168.4.109 port=64517说:333
客户端-/192.168.4.109 port=64518说:444
客户端-/192.168.4.109 port=64517说:444
客户端-/192.168.4.109 port=64518说:555
客户端-/192.168.4.109 port=64517说:exit
客户端-/192.168.4.109 port=64518说:exit