2013-04-03 46 views
0

我有一个简单的UDP服务器运行在一个设备上,当一个客户端想要连接时,它向服务器发送一条消息“connect”,然后服务器将地址,并开始发送数据到该地址,现在当另一个客户端想要加入时,该客户端发送消息“连接”,但有时没有任何反应,这就像客户端想加入消息永远不会被服务器接收,我将如何修复这个?另外这里是服务器多个UDP客户端发送数据包到一个主机不起作用

protected String doInBackground(String... params) { 
    boolean run = true; 
    String data = ""; 
    DatagramPacket packet = null; 
    boolean position = false; 
    while(run) 
    { 
     if(data.equalsIgnoreCase("")) 
     { 

     } 

     //Send some data 
     if(data.equalsIgnoreCase("connect") && wait == true) 
     { 
      Log.d(TAG, "Someone wants to connect"); 
      //Increase the total players by 1 
      players = players + 1; 
      //Notify to the host (client) something has change 
      //notify client 
      //Send a message to the client with the ID 
      byte[] bufer = new byte[256]; 
      //Send a message "connect" to the host 
      String msg = Integer.toString(players); 
      int msgLength = msg.length(); 
      bufer = msg.getBytes(); 
      InetAddress address; 
      //Default ip address of the host 
      //Take the address from the packet 
      addresses.add(packet.getAddress()); 
      Log.d(TAG, "Address is " + addresses.get(addresses.size() - 1)); 
      address = addresses.get(addresses.size() - 1); 
      DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port); 
      //Send packet 
      try 
      { 
       socket.send(p); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      wait = false; 
     } 

     if(wait == true && position == true) 
     { 
      position = false; 
      wait = false; 
     } 

     for(int i = 0;i < positions.length; i++) 
     { 
      if(positions[i] != null) 
      { 
      //Log.d(TAG, "X and Y position of asset:"+i+", is:"+ positions[i]); 
      } 
     } 

     //Needs to try and reteive data... 
     if(wait == false) 
     { 
      //Log.d(TAG, "Waiting to retreive data"); 
      byte[] buf = new byte[256]; 
      packet = new DatagramPacket(buf, buf.length); 
      try 
      { 
       socket.receive(packet); 
       wait = true; 
      } 
      catch (IOException e) 
      { 
       Log.d(TAG, "Error with receiving data"); 
       e.printStackTrace(); 
      } 

      data = new String(buf, 0, packet.getLength()); 
      //Log.d(TAG, "Data received from :" + packet.getAddress() + ", holds this value: " + data); 
      String[] dataStrings = data.split(":"); 
      if(dataStrings[0].equalsIgnoreCase("position")) 
      { 
       position = true; 
      } 
     } 



     //Log.d(TAG, "Data received was :" + data); 

     /*try 
     { 
      Thread.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"); 
    return "finished"; 
} 

客户端代码连接到服务器

public void connectToServer() 
{ 
    //Send a connect message to the server 
    try { 
     //Create a socket 
     socket = new DatagramSocket(port); 
     byte[] bufer = new byte[256]; 
     //Send a message "connect" to the host 
     String msg = "connect"; 
     int msgLength = msg.length(); 
     bufer = msg.getBytes(); 
     InetAddress address; 
     //Default ip address of the host 
     address = InetAddress.getByName("192.168.1.59"); 
     DatagramPacket p = new DatagramPacket(bufer, bufer.length , address, port); 
     //Send packet 
     socket.send(p); 

    } catch (UnknownHostException e2) { 
     Log.d(TAG, "Unknown host"); 
     e2.printStackTrace(); 
    } catch (SocketException e) { 
     Log.d(TAG, "Socket problem"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d(TAG, "I/O problem"); 
     e.printStackTrace(); 
    } 

    //Receive the message back 
    byte[] buf = new byte[256]; 
    DatagramPacket packet = new DatagramPacket(buf, buf.length); 
    //Try to receive a packet from the server 
    try 
    { 
     Log.d(TAG, "Waiting for data"); 
     socket.receive(packet); 
    } 
    //Error 
    catch (IOException e) 
    { 
     Log.d(TAG, "Error with receiving data"); 
     e.printStackTrace(); 
    } 

    //Convert the packet to a string 
    String data = new String(buf, 0, packet.getLength()); 

    //Use the string to find out what ID this client is 
    ID = Integer.parseInt(data); 
    //Setup the client game 
    setUpClient(); 
} 

我应该尝试并获得connectToServer方法不断地尝试,如果事情是不正确的代码?

帆布

回答

0

客户端不第一个“连接”字符串之后发送任何内容到服务器。因此,服务器在该行永远等待:

socket.receive(packet); // <- will never return 
wait = true; 

不管怎么说,你应该如服务器的recv()循环避免使用的AsyncTask长时间运行的任务,并重构服务器代码的不同情况(收到“连接'消息或来自已知客户端的消息)。

+0

我现在正在处理这个问题,并且我在Android设备上使用AsyncTask,其中一些在ver4及更高版本上运行,线程无法通过GUI使用,我当然会检查代码一旦我得到一切工作正常,只是想获得东西的工作:) – Canvas

+0

oohh也客户端将不断发送数据到服务器,一旦他们已经连接,我没有显示代码,因为这不是问题 – Canvas

+0

那么什么正在发生的事情是,已经连接的客户端正在保持套接字接收繁忙,并且新客户端无法发送连接,因为它很忙。 – Canvas

相关问题