UDP从一个设备发送数据到另一个

问题描述:

我试图从一个设备到另一个送过来一小包, 我的设备的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() 
{ 

} 
} 

当代码尝试接收它只是crashs在socjet.receive(包)包; 任何人都可以看到任何理由为什么?

帆布

+0

如果'插座=新的DatagramSocket(50000);'失败,socket.receive(包);将失败,因为套接字将为空。务必确保缓存所有可能的异常,例如'NullPointerException',或将所有套接字逻辑封装在一个try/catch子句中。 – 2013-03-24 01:28:39

+0

我会尽快尝试,但是我不需要告诉客户端它应该尝试并查看哪个IP地址? – Canvas 2013-03-24 01:29:15

你的问题是,你有两个try块。如果第一个捕捉到socket的东西保持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!

也可以考虑自动搜索,而不是静态IP的:AutoDiscovery

+0

AutoDiscovery做什么?你发送一个简单的数据包,然后接收IP?我仍然不明白为什么客户端不需要知道主机的IP地址?我的主机位于LAN上的设备IP地址192.168.1.59上,我的客户机如何知道从该IP地址接收到数据包? – Canvas 2013-03-24 02:17:04

+0

在这种情况下,它会向网络中的所有连接对等点发送一些内容。现在,每个人都知道发件人的IP,并可以回应“嘿,我在这里拿我的IP”。因此,您收到网络中客户端的IP,但您不知道他的IP。 – bluewhile 2013-03-24 02:18:53

+0

但是,假设我知道主机IP地址是什么,我可以让客户端启动一个数据报包,将它发送给主机,主机会收到“连接”,然后主机将采用“连接”的IP地址,消息,发送一些东西说你已经连接,然后主机将存储IP地址,以保持发送数据包是啊? – Canvas 2013-03-24 02:21:29