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(包)包; 任何人都可以看到任何理由为什么?
帆布
你的问题是,你有两个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
AutoDiscovery做什么?你发送一个简单的数据包,然后接收IP?我仍然不明白为什么客户端不需要知道主机的IP地址?我的主机位于LAN上的设备IP地址192.168.1.59上,我的客户机如何知道从该IP地址接收到数据包? – Canvas 2013-03-24 02:17:04
在这种情况下,它会向网络中的所有连接对等点发送一些内容。现在,每个人都知道发件人的IP,并可以回应“嘿,我在这里拿我的IP”。因此,您收到网络中客户端的IP,但您不知道他的IP。 – bluewhile 2013-03-24 02:18:53
但是,假设我知道主机IP地址是什么,我可以让客户端启动一个数据报包,将它发送给主机,主机会收到“连接”,然后主机将采用“连接”的IP地址,消息,发送一些东西说你已经连接,然后主机将存储IP地址,以保持发送数据包是啊? – Canvas 2013-03-24 02:21:29
如果'插座=新的DatagramSocket(50000);'失败,socket.receive(包);将失败,因为套接字将为空。务必确保缓存所有可能的异常,例如'NullPointerException',或将所有套接字逻辑封装在一个try/catch子句中。 – 2013-03-24 01:28:39
我会尽快尝试,但是我不需要告诉客户端它应该尝试并查看哪个IP地址? – Canvas 2013-03-24 01:29:15