2013-03-24 2 views
0

Я пытаюсь отправить через небольшой пакет от одного устройства к другому, Моего устройство IP является 192.168.1.59, который является хозяином, Вот мой код сервераUDP передачи данных от одного устройства к другому

public class gameServer extends Thread{ 

/** 
* Sets up a server for Android applciation 
*/ 
private static final String TAG = "GameServer"; 
private DatagramSocket socket; 
private int port = 50000; 
private InetAddress local = null; 

public gameServer() throws IOException 
{ 
    socket = new DatagramSocket(port); 
    Log.d(TAG, "Server was setup"); 
} 

private String getLocalIPAddress() 
{ 
    try 
    { 
     for (Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); nis.hasMoreElements();) 
     { 
      NetworkInterface ni = nis.nextElement(); 
      Log.v(TAG, "NetworkInterface = " + ni.getDisplayName()); 
      for (Enumeration<InetAddress> ips = ni.getInetAddresses(); ips.hasMoreElements();) 
      { 
       InetAddress ip = ips.nextElement(); 
       String s = ip.getHostAddress(); 
       Log.v(TAG, "InetAddress = " + s); 
       if (!ip.isLoopbackAddress()) 
       { 
          if(InetAddressUtils.isIPv4Address(s)) return s; 
       } 
      } 
     } 
    } 
    catch (SocketException e) 
    { 
      Log.e(TAG,"getLocalIPAddress()", e); 
    } 
    return null; 
} 

public void passClient(gameObject clientTemp) 
{ 

} 

@Override 
public void run() 
{ 
    Log.d(TAG, "Ip address used:" + getLocalIPAddress()); 
    while(true) 
    { 
     //Send some data 
     try 
     { 
      local = InetAddress.getByName("127.0.0.1"); 
     } 
     catch (UnknownHostException e2) { 
      e2.printStackTrace(); 
     } 
     String msg = "hello there"; 
     int msgLength = msg.length(); 
     byte[] message = msg.getBytes(); 
     DatagramPacket p = new DatagramPacket(message, msgLength, local, port); 
     try 
     { 
      socket.send(p); 
     } 
     catch (IOException e2) 
     { 
      Log.d(TAG, "Error with sending"); 
      e2.printStackTrace(); 
     } 

    } 
} 
} 

Вот мой клиент

public class gameClient extends Thread { 

private static final String TAG = "gameClient"; 
private gameServer server; 
private boolean rdyForPlay = false; 
private ArrayList<gameObject> assets = new ArrayList(); 
private int ID = 0; 
private maths cal = new maths(); 

public gameClient(boolean serverTag) 
{ 
    if(serverTag == true) 
    { 
     try 
     { 
      server = new gameServer(); 
      server.run(); 
     } 
     catch (IOException e) 
     { 
      Log.d(TAG, "Could not start server"); 
      e.printStackTrace(); 
     } 
    } 
    else 
    { 
     //DELETE!!! 
     //ONLY FOR TESTING 
     DatagramSocket socket = null;; 
     try 
     { 
      socket = new DatagramSocket(50000); 
     } 
     catch (SocketException e1) 
     { 
      e1.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()); 

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


    } 
} 

public void sendTouchEvent(float xSet, float ySet) 
{ 

} 

@Override 
public void run() 
{ 

} 

private void updateAssets() 
{ 

} 
} 

Когда код пытается получить пакет он просто вылетает на socjet.receive (пакета); может ли кто-нибудь увидеть причину?

Холст

+0

Если 'сокет = новый DatagramSocket (50000);' не удается, socket.receive (пакет); произойдет сбой, так как сокет будет равен нулю. Всегда следите за тем, чтобы кешировать все возможные исключения, такие как 'NullPointerException', или переносить всю логику сокета в одно предложение try/catch. –

+0

Я попробую это скоро, но не нужно ли мне сообщать клиенту, какой IP-адрес он должен попробовать и посмотреть? – Canvas

ответ

1

Ваша проблема заключается в том, что у вас есть два try блоков. Если первый поймает что-то гнездо остается null. Так что-то вроде этого:

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

Убедитесь, что close() сокет OnDestroy вашей деятельности!

Также рассмотреть AutoDiscovery вместо статического IP-адресов: AutoDiscovery

+0

Что делает AutoDiscovery? что вы отправляете простой пакет, а затем получаете ip? Я все еще смущен тем, почему клиенту не нужно знать IP-адрес хоста? Мой хост находится на 192.168.1.59, который является IP-адресом устройства в локальной сети, как мой клиент знает, чтобы получить пакет с этого IP-адреса? – Canvas

+0

, в этом случае он отправляет что-то всем подключенным одноранговым узлам в вашей сети. Теперь каждый из них знает IP-адреса отправителя и может ответить «Эй, я здесь беру мой IP». Таким образом, вы получаете IP-адрес клиента, который находится в вашей сети, но вы не знаете его IP. – bluewhile

+0

Но скажем, я знаю, что такое IP-адрес хоста, могу ли я заставить клиента запустить пакет датаграммы, отправить его на хост, хост получит «соединение», тогда хост получит IP-адрес «connect», сообщение, отправить что-то сказать, что вы подключились, а затем хост будет хранить IP-адрес, чтобы продолжать отправлять пакеты? – Canvas