失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android手机客户端与pc机进行socket通信

android手机客户端与pc机进行socket通信

时间:2024-06-06 21:44:07

相关推荐

android手机客户端与pc机进行socket通信

这两天做了一个手机和电脑通信利用socket进行网络通信的小程序,上图先:

在写程序的过程中发现了很多问题。。。

一、电脑和手机的IP必须在同一个网段,也就是IP的前三段必须是一样的。

刚开始电脑和手机都连着老师办公室的 无线,可是却连不上。。折腾了好久才发现虽然都是连在同一个路由器,网段却不一样。(老师说应该是一样的,我也不知道怎么回事。)后来修改了手机的IP地址,才能连上。关于如何修改手机IP,百度一下就OK了。

二、ReadLine()读数据阻塞问题

终于连接上了,却读不出数据。经过debug发现readline后面的代码都不再执行了。上网搜了一下readline,才发现原来是个坑。有关知识看这里

小心readline。解决方法:在每次发送数据前加换行符。

<span style="font-size:14px;">out.write((data + '\n').getBytes("GBK"));</span>

三、pc端的字符编码格式是GBK,而手机端的格式是UTF-8.在收发消息时会出现乱码。

解决方法:在将数据写入流的时候,指定数据的编码格式。

<span style="font-size:14px;">writer.write(me.getBytes("utf-8"));</span>

四、这是今天才发现的一个问题。当我在新创建的线程中执行

<span style="font-size:14px;">textView.append("服务器:" + b + '\n');</span>

抛出

java.lang.RuntimeException: Can't create handler inside thread that has not异常。

网上搜了一下,有关UI的操作必须在UI线程中去执行。如果其他线程获得的数据要改变UI界面,必须用handler想UI线程发送消息,告诉UI线程。

解决方法:在主线程用一个handler对象来处理消息,在自己创建的线程中用handler对象向主线程发送消息。

主线程:

handler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if(msg.what == 0x1314){textView.append("服务器:" + b + '\n');}return true;}});

新线程:

new Thread(new Runnable() {@Overridepublic void run() {try {socket = new Socket("192.168.0.103", 5000);Log.e("--->", "已发出链接请求");in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = socket.getOutputStream();while (socket != null) {b = in.readLine(); //注意阻塞//textView.append("服务器:" + b + '\n');handler.sendEmptyMessage(0x1314);}} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();

折腾了这么一顿,终于可以正常运行了!

项目代码:

项目代码

如果觉得《android手机客户端与pc机进行socket通信》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。