Scoket-----UDP---简易聊天室

UDP:

1 特点:

1.底层基于流的模式,不会去创建连接 ,所以安全性不可靠,但是传送速度块
2.是以数据包的形式进行数据的传输,发送者使用数据包发送,接受者同样使用数据包接收
3.传输的类为DatagramSocket   ,   数据包为  DatagramPacket
4.一般使用在视频聊天

2.代码实现

发送者:

public class UDPSenderDemo {
	public static void main(String[] args) throws IOException {
		// InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 2055);
	    //	DatagramSocket ds = new DatagramSocket();
	   
	    // 创建套接字对象 
	    // 参数为: 要发送的地址 ,  端口号
		DatagramSocket ds = new DatagramSocket(new InetSocketAddress("127.0.0.1", 2055));
		
		// 数据包  构造方法有接受和发送的
		// 参数为: 要发送的byte数组,  要发送的数组长度,  传输类对象
		//  * length的要求和byte的长度一致
		DatagramPacket dp = new DatagramPacket("你好".getBytes(),"你好".getBytes().length,isa);
		
		// 发送数据包
		ds.send(dp);
		
		// 闭包
		ds.close();
	}
}

接受者:

public class UDPReceiverDemo {
	public static void main(String[] args) throws Exception {
		// 套接字  一直监听发送者的端口号
		DatagramSocket ds = new DatagramSocket(2055);
		
		// 创建需要接受的包,  第二个参数为实际所需要的长度
		DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
		
		// 接受
		ds.receive(dp);
		
		// 关流
		ds.close();
		
		// 解析数据包
		System.out.println(new String(dp.getData(),0,dp.getLength()));
	}
}
  • *必须先启动接受者,在启动传输者

代码实现简易的聊天(多线程)

public class UDPChatDemo {
	public static void main(String[] args) {
		new Thread(new Sender()).start();
		new Thread(new Receiver()).start();
	}
}


// 发送者
class Sender implements Runnable{
	DatagramSocket ds;
	Scanner sc;
	@Override
	public void run() {
		try {
			ds = new DatagramSocket();
			sc = new Scanner(System.in);
			while(true) {
				byte[] b =  sc.nextLine().getBytes();
				DatagramPacket dp = new DatagramPacket(b, b.length,
						new InetSocketAddress("127.0.0.1", 3360));
				ds.send(dp);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}


// 接受者
class Receiver implements Runnable{
	DatagramSocket ds;
	DatagramPacket dp;
	@Override
	public void run() {
		try {
			ds = new DatagramSocket(3360);
			dp = new DatagramPacket(new byte[1024], 1024);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 while(true) {
			 // 接收数据包
			 try {
				ds.receive(dp);
				// 解析
				System.out.println(new String(dp.getData(),0,dp.getData().length));
				System.out.println(dp.getAddress());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 }
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值