Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中接收UDP数据包_Android_Networking_Udp_Chat_Datagram - Fatal编程技术网

在android中接收UDP数据包

在android中接收UDP数据包,android,networking,udp,chat,datagram,Android,Networking,Udp,Chat,Datagram,我正在为android开发一个P2P聊天/共享应用程序。以下代码用于接收UDP数据包,但仅接收并显示第一条消息/数据包。(发送代码没有问题。)随后的聊天信息不会显示。while循环似乎在chathistory.setText(新字符串…)执行后退出。例如:chathistory.setText(“test”);未执行。有人能指出错误吗?没有引发异常 public void receive() throws Exception { (new Thread(new R

我正在为android开发一个P2P聊天/共享应用程序。以下代码用于接收UDP数据包,但仅接收并显示第一条消息/数据包。(发送代码没有问题。)随后的聊天信息不会显示。while循环似乎在chathistory.setText(新字符串…)执行后退出。例如:chathistory.setText(“test”);未执行。有人能指出错误吗?没有引发异常

public void receive() throws Exception
        {
        (new Thread(new Runnable() {

        @Override
        public void run() {
            try 
            {
                ds1=new DatagramSocket(7777);
                //chathistory.setText("Holding the port...");

                while(true)
                {

                    DatagramPacket p = new DatagramPacket(buffer, buffer.length);
                    ds1.receive(p);
                    chathistory.setText(new String(p.getData(), 0, p.getLength()));
                    chathistory.setText("test");

                }
            }
                    catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
        }   

        } })).start();
    }

首先,Androids的UI调用都不是线程安全的,而且由于您的进程主线程用于更新UI,因此您永远不应该从任何其他线程操作Android中的UI元素,但您的活动正在运行的线程除外

第二,您可能会抛出异常,因为logcat无法从另一个线程打印


第三,我很好奇这段代码是否曾试图强行关闭你,我之所以这么问是因为我很好奇,如果.receive被阻塞很长时间,android会怎么做,你可能应该使用超时。

e.printStackTrace()
不会显示在logcat中,因此您可能会丢失一个异常。请将该行替换为
抛出新的RuntimeException(e)
,以便在异常发生时将其显示出来。谢谢。我必须使用处理程序来操作UI元素。无论如何,现在我的应用程序只能在单个访问点上运行,例如192.168.1.255(我可以使用dhcpinfo生成广播地址)。由于android不接收255.255.255.255广播的数据包,您知道我如何使用扩展BSS配置发现连接到同一LAN上其他接入点的android设备吗?(我为离题道歉,但我的问题在另一篇帖子上没有得到回答&我真的非常想知道。)