看似简单,其实不易,细节是魔鬼…
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(); msg是string