网络编程UDP多线程聊天室

面向无连接,发数据之前不需要链接,将数据打包过后发送数据,如果地址没找到就把包丢弃,分为发送端和接收端
1、将数据及源和目的封装成数据包中,不需要建立连接
2、每个数据包的大小在限制64k内
3、因为连接,是不可靠协议
4、不需要建立连接,速度快
聊天工具udp协议
步骤:
发送端:
1、定义sockte服务
2、提供数据并将数据封装到数据包
3、通过sockte的send方法将数据包发送出去
接收端:
1、定义sockte服务并监听端口
2、定义一个数据包,用于接收储存接受到的数据
4、通过数据包功能将这些不同数据取出
/*
 * udp实现网络聊天
 * 使用多线程实现一个控制接收一个控制发送*/

class Send implements Runnable{
	private DatagramSocket ds;
	Send(DatagramSocket ds){
		this.ds = ds;
	}
	public void run() {
		try {
			
			BufferedReader br = 
					new BufferedReader(new InputStreamReader(System.in));
			String len=null;
			while((len=br.readLine())!=null){
				if(len.equals("end"))
				break;
				byte[] buf = len.getBytes();
				DatagramPacket pac = 
						new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.2.255"), 10003);
				ds.send(pac);
			}
		} catch (Exception e) {
			throw new RuntimeException("发送异常");
		}
	}
}
class recev implements Runnable{
	private DatagramSocket rds ;
	public recev(DatagramSocket rds) {
		this.rds = rds;
	}
	public void run() {
		try {
			while(true){
				byte[] buf = new byte[1024];
				DatagramPacket rdpk = new DatagramPacket(buf, buf.length);
				rds.receive(rdpk);
				String ip = rdpk.getAddress().getHostAddress();
				String count = new String(rdpk.getData(), 0, rdpk.getLength());
				int port = rdpk.getPort();
				System.out.println("来自:"+ip+"端口:"+port+"信息:"+count);
			}
		} catch (Exception e) {
			throw new RuntimeException("接收异常");
		}
	}
	
}
public class Thred_UDP {
	
	public static void main(String[] args) throws Exception{
		DatagramSocket sds = new DatagramSocket();
		DatagramSocket rds = new DatagramSocket(10003);
		Send send = new Send(sds);
		recev recev = new recev(rds);
		Thread sendtThread = new Thread(send);
		Thread recevThread = new Thread(recev);
		sendtThread.start();
		recevThread.start();
	}

}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------


你可能感兴趣的:(学习笔记)