`
hua397
  • 浏览: 54043 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android UDP socket

 
阅读更多

  看似简单,其实不易,细节是魔鬼…

1.首先找到google code(感谢老外:http://code.google.com/p/boxeeremote/wiki/AndroidUDP),基本框架有了,另起一个class,把它放进去

2.首先模拟器不能测试,mac不能识别神舟pad...只能每次打包,拷进pad,几十次的安装测试,耗时巨大…

3.IP问题:UDP广播是向255.255.255.255发送消息,源码说不行…实际上是可以的…

然后是本地IP的问题,直接找到一个:

try {  

        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {  

            NetworkInterface intf = en.nextElement();  

            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {  

                InetAddress inetAddress = enumIpAddr.nextElement();  

                if (!inetAddress.isLoopbackAddress()) {  

                String localIP=inetAddress.getHostAddress().toString();

                    //Toast.makeText(null, localIP.subSequence(0, localIP.length()-1), 0);


                    return localIP;  

                }  

            }  

        }  

    } catch (SocketException ex) {  

        Log.e("IP error", ex.toString());  

    }  


4.编码问题,开始和mac本地服务端(自己写的,mac下测试)测试,老是发送不完全,怀疑是mac的echoserver显示有问题,而iphone程序发送的毫无压力,说明不是显示问题,而是android发过来的数据包丢失,看网上代码/文档,没发现有java socket每次发送一部分从而多次发送的函数,都是和源码一样的用法,人品爆发,找到个帖子说是中文编码问题,有中文的时候string.length()计算得到的长度将近少了一半,中文字符占两字符…OK,解决方法:

str.getBytes().length

5.Thread和handler交互,一般的thread都和handler在同一作用域,直接就可以h.sendMessage,而自定义的Thread类,则不行,暂时用传参的方式保存handler的引用,然后搞错了h.handleMessage(),我勒个去,报错:

Can't create handler inside thread that has not called Looper.prepare()

还傻傻地加prepare进去,最终还是发现应该用h.sendMessage…

6.socket接收数据,直接receive即可,不需要while循环接收,而且最后需要加上close,不然只能发/收一次,第二次就不行了,我还以为是thread的问题,还傻傻地每次重装程序(懒得找进程来kill)

7.UI问题,Toast不会用…标记:

Toast.makeText(this,msg,Toast.LENGTH_LONG).show();

8.纸老虎CharSequence,其实直接用string

public static Toast makeText (Context context, CharSequence text, int duration)

Toast.makeText(this,msg,Toast.LENGTH_LONG).show();  msgstring

                   

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics