java - 套接字正在运行但未通过端口接收值

标签 java android

我有一个 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/

相关文章:

java - 如何在 google-app-engine (java) 中设置复杂的自定义 crontab?

java - java IoC框架如何保证线程安全?

Java - Linux 中可视化程序的错误

iphone - 弹性 :Can we develop flex mobile project that runs in both android and iphone

android - RelativeLayout -> match_parent 与父 View 大小不一样

android + 共享首选项

java - 如何将jscrollpane添加到jframe?

java - 在java中将DBPedia SPARQL结果写入RDF文件

android - 在 Android MVP 模式中具有处理程序的演示者

android - 自定义日历日期范围滑动选择android