为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

	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 回答

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

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


2 回复 有任何疑惑可以回复我~
#1

xiele 提问者

明白了 原来是这样 谢谢
2015-10-11 回复 有任何疑惑可以回复我~
#2

慕数据3802251

按照“每一次都要等上一次的数据输出后才能重新接收”这个话来理解的话,那第二次服务器接收客户端信息要在第一次信息输出之后,但是结果显然是没有第一次的输出,这不是矛盾吗?我认为这并不是正解。
2016-03-21 回复 有任何疑惑可以回复我~
#3

lucitas 回复 慕数据3802251

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

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

1 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

同问啊


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信