亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

【求助】UDP多線程

想要實現多線程的話,服務器應該需要循環偵聽等待客戶端的連接吧?可是UDP的數據報如何像TCP的輸入流那樣,擁有一個終止的判斷條件(while(...) != null)呢?如果沒有終止條件,循環偵聽就真正陷入死循環了……

正在回答

4 回答

比較蛋疼,估計是引用對象太多了,而tcp中客戶端未連接他就不建立線程,但是UDP一直引用對象建立線程,導致CPU飆升

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

可以在while循環語句里添加 ? break; 語句塊

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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號