我有一个 OpenPicus Flypport
设备,当通过端口号 50000 (UDP) 使用正确的字符串进行查询时,它会发送 JSON
字符串。
嗯,这并不是强制性的,只是为了提供信息
我正在做的是使用正确的 json 查询设备,然后设备回复。但我的 Android 代码没有收到回复。我已获取所有必需的 WIFIManager 代码
和 Wifi 权限
。
为了检查 Android 是否正在广播天气,我编写了一个在笔记本电脑上运行的 java 程序。在那里我发现 Android 和 Flyport 设备正在通信。
我编写了以下代码:
从 Android 发送
System.out.println("Sending Flyport");
FlyportDriver flyDriver = new FlyportDriver();
sendMulticastFlyport = new Thread(new FlyportSender(set.getFlyportIP() , flyDriver.getDeviceDiscovery()));
//flyport.getDeviceDiscovery is JSON String. Sending is fine. No problem
sendMulticastFlyport.start();
System.out.println("Flyport Send: "+flyDriver.getDeviceDiscovery());
deviceStartCounter++;
在 Android 上接收
private class DeviceSearcher extends AsyncTask<Void, DeviceInformation ,Void>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
//TableLayout deviceTable = (TableLayout) findViewById(951357);
TableRow tr = new TableRow(getApplicationContext());
LayoutParams layout = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
tr.setLayoutParams(layout);
TextView tv = new TextView(getApplicationContext());
tv.setText("Searching...");
tv.setLayoutParams(layoutParam);
tv.setTextColor(Color.WHITE);
tv.setVisibility(View.VISIBLE);
tr.addView(tv);
deviceTable.addView(tr);
}
@Override
protected Void doInBackground(Void... arg0)
{
new Thread()
{
public void run()
{
MulticastSocket socketFlyport=null;
try
{
socketFlyport = new MulticastSocket(50000);
socketFlyport.setSoTimeout(1*20*1000);
byte[] inBufFlyport = new byte[1024];
DatagramPacket inPacketFlyport = new DatagramPacket(inBufFlyport, inBufFlyport.length);
while(true)
{
System.out.println("Listening..."); //Printing
socketFlyport.receive(inPacketFlyport); //not receiving
String msg = new String(inBufFlyport, 0, inPacketFlyport.getLength());
Log.v("Received:","Received Flyport From :" + inPacketFlyport.getAddress() + " Msg : " + msg);
String IP = inPacketFlyport.getAddress().toString();
System.out.println(Utils.getIPAddress(true));
try
{
System.out.println("Received");
DeviceInformation device = new DeviceInformation(3, IP.substring(1), msg, getApplicationContext());
publishProgress(device);
}
catch(Exception e)
{
System.out.println(e.toString());
}
Log.v("Received:","Received Flyport From :" + inPacketFlyport.getAddress() + " Msg : " + msg);
System.out.println();
Thread.sleep(2500);
}
}
catch(Exception e)
{
Log.v("Exception:","During Receiving Flyport: "+e.toString());
publishProgress((DeviceInformation)null);
}
finally
{
socketFlyport.close();
}
}
}.start();
return null;
}
如果你会看到,那么我已经打印了一些变量。
最佳答案
是的,正如 EJP 所说,如果您使用多播,那么您需要加入多播组。为了清楚起见,您应该显示您对 MulticastLock 的使用以及您请求的 Android 权限。
话虽如此,Android 中的多播支持似乎并不像某些用户希望的那样可靠。请参阅http://codeisland.org/2012/udp-multicast-on-android/
我最初认为它是否真的有效或者可能取决于设备。它在我的 Nexus5 上无法运行。请参阅https://code.google.com/p/android/issues/detail?id=51195
但后来我发现重置路由器会使 Android 设备开始接收多播帖子。我怀疑这里存在一些 Android 设备经常遇到的边缘情况。
关于java - 套接字正在运行但未通过端口接收值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704791/