App Inventor插件开发(六)WiFi局域网socket通信

已上传GitHub,包括源码及aix,以及测试用aia,顺便贴个apk上去。
国内可以访问Gitee,来自开学后虚脱的我。。。
ps2019.06.15
emm我非常不建议大家使用这个插件,这个是赶工的东西,能够实现的功能很有限,可扩展性几乎为零。为了提高编码速度我放弃了太多,处处可看出为了编码效率牺牲可读性和功能,毕竟加上看tcp/ip我总共才码了3小时,能写成啥样呢
我也很想说这个代码实现很不优美,的确烂的和shit一样。。。我隔了一年都看不懂了
这里只是用来示范连接的操作流程,大家可根据自己的需要自行修改

0.前言

Wifi下通信应该是大家都希望的吧,网上TaifunWiFi似乎很高级的样子,但是原谅我英语渣,看不懂。。。
mac和ip我懂,可是ssid是神马。。。看来我tcp/ip还没啃到家。。。
TaifunWiFi盯了半天似乎好像大概可能应该差不多是怎么去连接WiFi而不是通信的。
好像很多人的需求是和arduino有关,谁能来介绍一下,不懂
Android下很多人都讲了怎么用socket通信,可是移植到app inventor上的很少。
那就让我来开心的皮一下,介绍一下怎么在局域网内通信,不止WiFi哦。

1.解决步骤

1.1原理

我就不扯tcp/ip了,估计也没人有心思听。
这里只是讲一些基础知识,因为这个插件目前只能传字符串,如果要更多功能就需要自行补充了。
两台计算机间进行通讯需要以下三个条件:IP地址、协议、端口号。
IP地址肯定听说过,用人话说就像一个港口。
端口号用于区分一台主机的多个不同应用程序,范围为0-65535,我取8000,0-1023为为系统保留。用人话讲就像港口有很多船位,可以同时停很多条船。
Socket由IP地址+端口号组成。在Java中是使用TCP协议实现的网络通信。
ServerSocket是服务端。
因为网络连接是一个非常耗时的操作,比读写硬盘还耗时,需要单独一个线程,甚至不止一个。

1.2测试时bug记录

Client客户端状态良好,可发,收等会再说
Sever服务端莫名智障,打电话也不接,发短信也不回,最后发现是message是直接new的,要从myHandler.obtainMessage()获取才有用,坑死我了。。。
又被这个message坑了一回,每次sendMessage都要重新获取message一回,或者相邻几行不用,我也没搞懂,反正每次sendMessage都获取一遍问题就解决了,不然闪退,连个报错都没有,连接adb才得到错误信息,坑啊
Sever服务端测试成功!
等我重写一下,达到能够使用的程度。
又是一个坑,OutputStream的flush()是个空方法,只能再建一个BufferedOutputStream。
readline结尾要加\n!不是OutputStream的问题,这是装饰模式,空方法就是用于覆盖。
测试完成,鉴定可食用。

1.3服务端源码讲解

全文见SocketUtil.java
收到消息的回调,顺便加了个回车

@SimpleEvent public void GetMessage(String s){
   
      EventDispatcher.dispatchEvent(this, "GetMessage", "\n"+s);
}

handler用于从子进程返回UI线程,并调用回调。
如果你需要区分不同的消息的话,设置what,在handler里if-else或switch都可以。

public Handler handler = new Handler(){
   

    @Override public void handleMessage(Message msg) {
   
		/*switch(msg.what){
			case 1:...break;
		}*/
		GetMessage(msg.obj.toString());
	}
};
/*Message message_1 = handler.obtainMessage();
message_1.what= 11;
message_1.obj = "";
handler.sendMessage(message_1);

获得ip以及port的代码

String ip;
int port;
private ServerSocket serverSocket = null;

public void getLocalIpAddress(ServerSocket serverSocket){
   

  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();
                String mIP = inetAddress.getHostAddress().substring(0, 3);
                if(mIP.equals("192")){
   
           
  • 11
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值