【.com速译】本文将创建一个简单的通信app,使用HTTP服务器在本地网络上收发消息。应用需要有一个简单的HTTP服务器来发送消息:获取我的本地IP地址尝试向每个本地IP发送一条消息,如:GETxxx.xxx.xxx.1/?msg=messageGETxxx.xxx。xxx.2/?msg=message...GETxxx.xxx.xxx.254/?msg=message本地IP地址我们需要获取本地IP地址来发送消息并创建HttpServer实例。这是一个简单的方法://硬编码,需要改进FuturemyLocalIp()async{finalinterfaces=awaitNetworkInterface.list(type:InternetAddressType.IPv4,includeLinkLocal:true);returninterfaces.where((e)=>e.addresses.first.address.indexOf('192.')==0)?.first?.addresses?.first?.address;}返回这样的IP地址:192.168.0.107我们将在前面使用三个字节向每个本地IP发送请求:192.168.0.xxxHttpServer为了能够接收请求,我们需要使用我们的本地IP和从1024到65353的任何端口创建一个HttpServer实例.FuturestartServe()async{finalip=awaitmyLocalIp();varserver=awaitHttpServer.bind(ip,8080);awaitfor(HttpRequestrequestinserver){_handleRequest(request);request.response.write('好的');awaitrequest.response.close();}}当我们收到请求时,我们返回“Ok”。要检查它是否有效,请使用此链接:http://{您的本地IP}:8080,您应该会看到Ok消息。在iOS或Android上检查之前需要添加权限。添加到iOS*info.plist*文件:NSAppTransportSecurityNSAllowsArbitraryLoads添加到*AndroidManifest.xml*文件:处理请求为了简单起见,我们将使用GET方法并使用查询参数来发送这样的消息:http://{localIP}:8080?msg=message&ipip=ip如果请求有像msg和ip这样的参数,我们将这些值添加到我们的消息列表中并调用setState或notify以在屏幕上显示列表:void_handleRequest(HttpRequestrequest){finalmsg=request.uri.queryParameters['msg'];finalfrom=request.uri.queryParameters['ip'];if(msg!=null){messages.insert(0,[from,msg]);//设置状态或更新}}发送消息我们有向每个本地IP发送信息。我们可以使用本地IP地址获取前三个字节并从中构建本地IP地址列表:voidsendMessage(Stringmsg)async{finalip=awaitmyLocalIp();finalthreeOctet=ip.substring(0,ip.lastIndexOf('.'));for(vari=1;i<200;i++){_sendRequest('$threeOctet.$i',"?ip=$ip&msg=$msg");}}void_sendRequest(Stringto,Stringpath)async{finalclient=HttpClient();client.connectionTimeout=constDuration(seconds:2);try{finalresp=awaitclient.get(to,8080,path);resp.close();}catch(e){}}在此示例中,它仅将消息发送到从x.x.x.1到x.x.x.199的IP地址,但理论上我们可以发送从1到255的IP地址。现在我们可以将信息发送到活动的本地设备。左下方的图像是物理iOS设备,右侧的图像是macOS桌面应用程序。虽然他们有不同的本地IP地址,但你可以看到他们可以互相发送消息。【翻译稿件,合作网站转载请注明原译者和出处为.com】