【求助】UDP多线程

来源:5-1 Socket 总结

五竹

2015-09-06 17:40

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

写回答 关注

4回答

  • 染红_街道
    2016-07-11 11:40:35

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

  • 小二and上酒
    2016-03-19 20:44:32

    可以在while循环语句里添加   break; 语句块

  • 阪有桑
    2015-10-16 19:58:24
    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();
    	}
    }


    慕粉2010...

    这里为什么不能关掉socket?

    2017-02-06 13:19:30

    共 1 条回复 >

  • ahnupeng
    2015-09-13 20:12:57

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

    五竹

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

    2015-09-14 20:27:48

    共 1 条回复 >

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

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

125012 学习 · 590 问题

查看课程

相似问题