2013-03-28 118 views
3

我有一個處理接收和發送UDP數據包的線程,這工作正常,直到X數據包已收到,然後客戶端只是停止嘗試接收數據包,並停止發送它們,所有的catch函數都不顯示任何內容,客戶端只是停止詢問數據包。 這裏是我的客戶端運行代碼Android線程剛剛停止

public void run() 
{ 
    if(host == true) { setUpClient(); server.start(); } 
    rdyForPlay = true; 
    boolean run = true; 
    boolean setupPlayer = false; 
    while(run) 
    { 
     //Tell the server to give position of players 
     //if(setupPlayer == true) 
     //{ 
     // setUpClient(); 
     // setupPlayer = false; 
     //} 

     if(host == false) 
     { 
      try { 
       if(socket == null) 
       { 
        socket = new DatagramSocket(port); 
       } 
       byte[] bufer = new byte[256]; 
       //String msg = "position"; 
       String msg = ID +":"+ assets[ID].returnPosX() +":"+ assets[ID].returnPosY(); 
       int msgLength = msg.length(); 
       bufer = msg.getBytes(); 
       InetAddress address; 
       address = InetAddress.getByName("192.168.1.59"); 
       DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port); 
       socket.send(p); 

      } catch (UnknownHostException e2) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with unknown host"); 
       e2.printStackTrace(); 
      } catch (SocketException e) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with socket"); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, "Error with sending/receiving data"); 
       e.printStackTrace(); 
      } 

      byte[] buf = new byte[256]; 
      DatagramPacket packet = new DatagramPacket(buf, buf.length); 
      try 
      { 
       socket.receive(packet); 
      } 
      catch (IOException e) 
      { 
       Log.d(TAG, "Error with receiving data"); 
       e.printStackTrace(); 
      } 

      String data = new String(buf, 0, packet.getLength()); 
      //Split the string up 
      String[] dataArray = data.split("#"); 
      int newTotalPlayers = Integer.parseInt(dataArray[0]); 
      if(newTotalPlayers != totalPlayers) 
      { 
       Log.d(TAG," what is total amount of players:" + newTotalPlayers); 
       if(newTotalPlayers == 1) 
       { 
        newPlayer(0); 
        totalPlayers = newTotalPlayers; 
       } 
       else 
       { 
        newPlayer(newTotalPlayers); 
        totalPlayers = newTotalPlayers; 
       } 
       //if(ID == 0 && host == false) 
       //{ 
       // ID = newTotalPlayers; 
       // setupPlayer = true; 
       //} 
      } 
      //Do a for loop to go through dataArray 
      for(int i = 0; i < totalPlayers; i++) 
      { 
       String[] pos = dataArray[(i + 1)].split(":"); 
       if(Integer.parseInt(pos[(i*3)]) == ID) 
       { 
        Log.d(TAG, "Do nothing please"); 
       } 
       else 
       { 
        assets[i].setPosition(Integer.parseInt(pos[(i*3) + 1]), Integer.parseInt(pos[(i*3) + 2])); 
       } 
      } 

     } 

    } 
    Log.d(TAG, "Error with run value"); 
} 

這工作得很好,它只是真讓我心煩的是,連接後,只要下降一些奇怪的原因,我無法找到如無印在所有的logcat

帆布

PS如果需要,可以

這裏被賦予更多的代碼是我的服務器運行的方法

public void run() { 
    InetAddress client = null; 
    boolean run = true; 
    String data = ""; 
    DatagramPacket packet = null; 
    while(run) 
    { 
     if(data.equalsIgnoreCase("")) 
     { 
      /*Log.d(TAG, "waiting for clients"); 
      String msg = "waiting"; 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      DatagramPacket p = new DatagramPacket(message, msgLength, client, port); 
      try 
      { 
       socket.send(p); 
      } 
      catch (IOException e2) 
      { 
       Log.d(TAG, "Error with sending"); 
       e2.printStackTrace(); 
      }*/ 
     } 

     //Send some data 
     if(data.equalsIgnoreCase("connect")) 
     { 
      Log.d(TAG, "ID send :" + packet.getAddress()); 
      address.add(packet.getAddress()); 
      players += 1; 
      String msg = String.valueOf(players); 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      DatagramPacket p = new DatagramPacket(message, msgLength, packet.getAddress(), port); 
      try 
      { 
       socket.send(p); 
      } 
      catch (IOException e2) 
      { 
       Log.d(TAG, "Error with sending"); 
       e2.printStackTrace(); 
       data = ""; 
      } 
     } 

     //if(/*data.equalsIgnoreCase("position")*/ address.size() > 0) 
     //{ 
      //Create for loop to create the string 
      String msg = ""; 
      msg = players + "#"; 
      for(int i = 0; i < players; i++) 
      { 
         msg += + i + ":" + assets.get(i).returnPosX() + ":" + assets.get(i).returnPosY() + ":"; 
      } 
      //msg = String.valueOf( 
      //  players + ":" + 
      //  "1:" + assets.get(0).returnPosX() + ":" + assets.get(0).returnPosY()); 
      int msgLength = msg.length(); 
      byte[] message = msg.getBytes(); 
      for(int i = 0; i < address.size() ; i++) 
      { 
       DatagramPacket p = new DatagramPacket(message, msgLength, address.get(i), port); 
       try 
       { 
        socket.send(p); 
       } 
       catch (IOException e2) 
       { 
        Log.d(TAG, "Error with sending"); 
        e2.printStackTrace(); 

       } 
      } 
      //Log.d(TAG, "Data sent is:" + msg); 
     //} 

     data = " "; 

     //Receive some data 
     byte[] buf = new byte[256]; 
     packet = new DatagramPacket(buf, buf.length); 
     try 
     { 
      socket.receive(packet); 
     } 
     catch (IOException e) 
     { 
      Log.d(TAG, "Error with receiving data"); 
      e.printStackTrace(); 
     } 

     data = new String(buf, 0, packet.getLength()); 
     //Log.d(TAG, "Data received was :" + data); 

     try 
     { 
      this.sleep(25); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      Log.d(TAG, "Error with trying to sleep"); 
      e.printStackTrace(); 
     } 
    } 
    Log.d(TAG, "Error with while run value"); 
} 

很抱歉的評論

+0

有趣,可能是連接自動停止了嗎? – Eugene 2013-03-28 09:42:15

+0

我會發布我的服務器運行方法 – Canvas 2013-03-28 09:43:46

+1

我會添加日誌顯示客戶端1)何時會收到一個數據包(包括接收數據包的數量); 2)已經收到一個數據包(包括收到的數據包的數量); 3)終止。一般來說,我已經看到無線網絡斷開和重新連接,沒有明顯的原因;如果是這種情況,你可能需要重新連接。 – 18446744073709551615 2013-03-28 09:54:03

回答

1

好像死鎖情況正在發生有兩個來源碼掛在socket.receive

幸運的是,Android和J2SE UDP Server客戶端代碼的代碼是相同的,因此請在您的機器上嘗試此代碼並進行調試以查看發生了什麼。您可以更好地瞭解打印語句。

此外UDP是不可靠的。在代碼中沒有看到接收到確認和重發機制的數據包。這是必需的。你不能假設你發送的數據包將被接收到另一端。

+0

您能否提供一些示例代碼?也閱讀我的評論1844以上 – Canvas 2013-03-28 09:59:36

+1

添加了一個簡單的布爾變量,沒有更多的死鎖:) – Canvas 2013-03-28 10:10:00