2013-03-28 134 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