2016-01-29 77 views
0

我有一個應用程序可以執行很多操作。我想添加一個方法,使該應用程序的行爲與套接字上的udp服務器相同。特別是它偵聽端口8888上的本地主機地址。我試圖用下面的代碼實現這種行爲,但我得到Address already in use error。而且整個應用程序都停留在這個udp服務器方法上。我想它可能是由於它的所有運行在一個線程上的事實。udp服務器上的java地址已經在使用錯誤

1)你能告訴我如何糾正我的方法。特別是如何使這個udp服務器監聽器在新線程上啓動。

2)該服務器將永久地聽取來自客戶端的pks。根據服務器是否接收到特定的數據包,它是否需要做某些事情。邏輯是否正確:如果packetReceived爲!= null並且數據包尚未處理,則對其進行處理。永遠重複(如代碼所示)?

public void startSocketListening(){ 
     byte[] receiveData = new byte[1024]; 
     DatagramPacket receivePacket; 
     System.out.println("Waiting to receive..."); 
     while (true) { 
      receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      try { 
       DatagramSocket serverSocket = new DatagramSocket(8888); 
       serverSocket.receive(receivePacket); 
       //if i receive a packet and it doesn't already have a flow rule process it 
       if ((receivePacket != null) && (newOFRuleAdded == false)){ 
        this.rlocAddress = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + rlocAddress); 
        System.out.println("RLOC: " + rlocAddress); 
        //process the message 
        newOFRuleAdded = true; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

這是不可能的'receivePacket'在你正在測試,通過的Java規則的點都成了空。 – EJP

回答

1

對於1) 首先移動至套接字創建(ServerSocket的新= DatagramSocket的(8888);)退出循環。那就是你的綁定失敗的錯誤來自哪裏。

最好把你的整個startSocketListening()代碼在一個類的run()方法擴展Thread或實現Runnable(見下面的代碼threadexample)

對於2)有可能是一個誤解。 「serverSocket.receive(receivePacket);」將等待收到一個數據包。因此,後來發生的任何事情都是從未處理過的新接收到的數據包。 while循環只是讓你回到等待一個新的數據包。

這樣的事情可能會發生。如果您不確定如何在接收數據包時逐步調試它的行爲。

public class UdpListener extends Thread 
{ 
    public void run() 
    { 
     byte[] receiveData = new byte[1024]; 
     DatagramPacket receivePacket; 
     System.out.println("Waiting to receive..."); 
     DatagramSocket serverSocket; 
     try { 
      serverSocket = new DatagramSocket(8888);  
      while (true) { 
       receivePacket = new DatagramPacket(receiveData, receiveData.length); 
       serverSocket.receive(receivePacket); 
       //if i receive a packet and it doesn't already have a flow rule process it 
       if ((receivePacket != null)){ 
        System.out.println("First byte of received package is: " + receivePacket.getData()[0]); 
       } 
      } 
     } catch (SocketException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

這樣調用:

Thread t = new UdpListener(); 
t.start(); 
+0

完美!謝謝 – Pheonix7

相關問題