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

【求助】UDP多线程

想要实现多线程的话,服务器应该需要循环侦听等待客户端的连接吧?可是UDP的数据报如何像TCP的输入流那样,拥有一个终止的判断条件(while(...) != null)呢?如果没有终止条件,循环侦听就真正陷入死循环了……

正在回答

7 回答

需要初始化storyboard,有个选项勾选下就好了

aakjzmlcfpm

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

单引号和双引号基本都是一种概念,但是二者一起出现时,需要特别注意。

gjmpnmcqslerfcloyyfa

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

比较蛋疼,估计是引用对象太多了,而tcp中客户端未连接他就不建立线程,但是UDP一直引用对象建立线程,导致CPU飙升

0 回复 有任何疑惑可以回复我~
UDPServer.java //服务端
========================================
package UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServe {
	public static void main(String[] args) {

		try {
			DatagramSocket socket = new DatagramSocket(9099);
			System.out.println("Serve is waiting...");

			byte[] data = null;

			DatagramPacket packet = null;

			while (true) {

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

				socket.receive(packet);

				UDPServeThread thread = new UDPServeThread(socket, data, packet);
				thread.start();
			}
			// socket.receive(packet);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

UDPServerThread.java   //服务线程
package UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServeThread extends Thread {

	DatagramSocket socket = null;

	byte[] data = null;

	DatagramPacket packet = null;

	public UDPServeThread(DatagramSocket socket, byte[] data,
			DatagramPacket packet) {
		this.data = data;
		this.socket = socket;
		this.packet = packet;
	}

	@Override
	public void run() {

		try {

			System.out.println("Serve is waiting...3");
			String info = new String(data, 0, packet.getLength());

			System.out.println("Receive Client " + info);

			// 响应数据
			InetAddress address = packet.getAddress();
			int port = packet.getPort();
			byte[] dataReply = "welcome".getBytes();
			DatagramPacket packetReply = new DatagramPacket(dataReply,
					dataReply.length, address, port);
			socket.send(packetReply);

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
//			socket.close();
		}

		super.run();
	}
}


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

慕粉20105833

这里为什么不能关掉socket?
2017-02-06 回复 有任何疑惑可以回复我~

我的也是,是不是不该创建那么多datagrampacket或者是没有关闭的原因,while一开,内存使用率直逼99%。

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

五竹 提问者

没有终止条件,while循环的结果就一直为true吧,那样就会一直执行下去了,感觉UDP多线程的设计思路应该与TCP的不一样,TCP只有一个Socket对象,UDP则有多个Packet,怎样做到对每一个Packet都去判断结束的条件才是问题所在
2015-09-14 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

【求助】UDP多线程

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