java UDP多线程回射服务器


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();
	}
	@Override
	public 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 exception
			e.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值