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() {
			
			@Override
			public boolean handleMessage(Message msg) {
				if(msg.what == 0x1314)
				{
					textView.append("服务器:" + b + '\n');
				}
				return true;
			}
		});


新线程:

new Thread(new Runnable() {

				@Override
				public 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 block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}).start();


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

项目代码:
项目代码


  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值