求指教:UDP线程接收多客户端数据

来源:4-3 编程实现基于 UDP 的 Socket 通信之客户端

xiele

2015-06-28 15:06

我写的跟“风中过客”差不多,出了点小问题,弄不明白,请老师指教

	public static class UDPThread extends Thread{
		DatagramSocket socket=null;
		DatagramPacket packet=null;
		public UDPThread(DatagramSocket socket, DatagramPacket packet) {
			super();
			this.socket = socket;
			this.packet = packet;
		}
		
		public void run(){
			byte[] data = packet.getData();
			String info = new String(data,0,packet.getLength());
			System.out.println("我是服务器,客户端说:"+info);
			
			//响应客户端
			byte[] data2 = "欢迎您!".getBytes();
			InetAddress address = packet.getAddress();
			int port = packet.getPort();
			DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
			try {
				socket.send(packet2);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

上面没什么问题,下面的main方法出问题了

	public static void main(String[] args) throws Exception {
		DatagramSocket socket = new DatagramSocket(8800);
		byte[] data = new byte[1024];
		DatagramPacket packet = new DatagramPacket(data, data.length);
		System.out.println("******服务器已经启动******");
		int count = 0;
		while(true){
			socket.receive(packet);
			UDPThread udpThread = new UDPThread(socket, packet);
			udpThread.start();
			count++;
			System.out.println("客户端数量为:"+count);
		}
	}

我把

byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);

放在循环外面

运行时不报错,但客户端发送请求后,第一次得不到回应,发送第二次请求后,得到第一次的回应

但服务端不显示接收到的内容

我学“风中过客”把这两句放循环里  就正常了

请问为什么?

写回答 关注

4回答

  • changing一铭惊人
    2015-10-11 12:39:00
    已采纳

    DatagramPacket p = new DatagramPacket(buf, buf.length);这个要放在while循环里面,因为每一次的

    receive()都要指定一个特有的DatagramPacket  p来接收每一个客户端发过来的请求,如果你放在外面的话,就每一次都要等上一次的数据输出后才能重新接收,这个就没有为每一个客户端各分配一个用来响应的reply了,不知道能不能帮到你!!


    lucita... 回复慕数据380...

    我觉得是定义在循环里的变量会在每次循环后,会被系统自动回收,因为每一次的 receive()都要指定一个新的DatagramPacket,如果把datagrampacket和数组放在循环外面,一次循环后,packet和数组里面,保存的将会是上一次循环的数据。所以会出错

    2016-04-16 17:19:50

    共 3 条回复 >

  • Eye9093
    2018-05-29 18:20:45

    感谢楼主和解答者的疑问帮助到了我

  • xiele
    2015-09-15 11:28:04

    玩线程的高手们,指点一下嘛

  • 慕斯卡3071394
    2015-08-26 23:59:18

    同问啊


Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125013 学习 · 590 问题

查看课程

相似问题