這很奇怪,我使用WireShark來測試結果,結果顯示我的代碼可以通過套接字成功發送消息。但即使我從服務器收到消息,我的程序也會拋出異常。
我不知道爲什麼會有超時問題。Java DatagramSocket超時但實際上已收到
我的代碼很簡單:
static Timer timer = new Timer();
try {
DatagramSocket c = new DatagramSocket();
c.setBroadcast(true);
byte[] sendData = "messageToServer".getBytes();
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 10000);
c.connect(InetAddress.getByName("255.255.255.255"), 10000);
c.send(sendPacket);
} catch(Exception ex) {
System.out.println(ex.toString());
}
timer.schedule(new receiveTask(), 2000);
} catch(Exception ex) {
System.out.println(ex.toString());
}
我使用計時器從服務器延遲消息的接收。
的receiveTask
類看起來是這樣的:
public class receiveTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket c2 = new DatagramSocket();
c2.setSoTimeout(10000);
byte[] recvBuf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
String message = "";
while (true) {
c2.receive(receivePacket);
System.out.println("Receive packet from Server");
message=new String(receivePacket.getData()).trim();
System.out.println(message);
System.out.println("Close the connection of server socket");
}
} catch(Exception ex) {
System.out.println(ex.toString());
}
}
}
而一個SocketTimeOut
異常在receiveTask
類拋出。由於服務器可以向我發送消息(在WireShark中測試過),所以我不認爲服務器端是好事。但是,什麼會導致超時?
爲什麼服務器返回一條消息給我,但我無法在我的程序中收到它?
我的Java版本是7,和它沒有什麼區別禁用我的電腦上的防火牆...
任何意見,將不勝感激!
編輯:雖然問題不是關於socket.close();我提取代碼。
您正在向端口10000發送消息,但您沒有收到端口10000.您在首次成功接收後關閉套接字,然後再嘗試另一個套接字。這沒有多大意義。 – EJP 2014-08-29 04:43:18