快速构建一个用本地网络发送和接收消息的APP

译文
开发 前端
构建一个可以通过本地网络发送和接收消息的应用程序可以使用sockets,但是今天我们将创建一个使用HTTP服务器进行通信的简单应用程序。

【51CTO.com快译】本文将创建一个使用HTTP服务器在本地网络发送和接收消息的简单通信APP。

该应用程序需要有一个简单的HTTP服务器发送消息:

  1. 获取我的本地IP地址
  2. 尝试发送消息到每个本地IP,如:
GET xxx.xxx.xxx.1/?msg=message
GET xxx.xxx.xxx.2/?msg= message
...
GET xxx.xxx.xxx.254/?msg= message

本地IP地址

我们需要获取本地IP地址来发送消息并创建HttpServer实例。下面是一个简单的方法:

// Hard coded, needs improvement
Future<String> myLocalIp() async {
final interfaces =
await NetworkInterface.list(type: InternetAddressType.IPv4, includeLinkLocal: true);
return interfaces
.where((e) => e.addresses.first.address.indexOf('192.') == 0)
?.first
?.addresses
?.first
?.address;
}

它返回一个类似这样的IP地址:192.168.0.107

我们将使用前三个字节向每个本地IP发送一个请求:192.168.0.xxx

HttpServer

为了能够接收请求,我们需要使用我们的本地IP和从1024到65353的任何端口创建一个HttpServer实例。

Future<void> startServe() async {
final ip = await myLocalIp();
var server = await HttpServer.bind(ip, 8080);
await for (HttpRequest request in server) {
_handleRequest(request);
request.response.write('Ok');
await request.response.close();
}
}

当我们收到一个请求时,我们返回' Ok '。要检查它是否有效,可以使用这个链接:http://{your local IP}:8080

你应该会看到Ok消息。

在iOS或Android上检查之前,需要添加权限。

添加到iOS *info.plist*文件:

<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/></dict>

添加到*AndroidManifest.xml*文件:

<uses-permission android:name="android.permission.INTERNET" />

处理请求

为了简单起见,我们将使用GET方法并使用查询参数来发送这样的消息:

http://{local IP}:8080?msg=message&ipip=ip

如果请求有msg和ip这样的参数,我们将这些值添加到我们的消息列表中,并调用setState或notify在屏幕上显示该列表:

void _handleRequest(HttpRequest request) {
final msg = request.uri.queryParameters['msg'];
final from = request.uri.queryParameters['ip'];
if (msg != null) {
messages.insert(0, [from, msg]);
// set state or update
}
}

发送消息

我们必须把信息发送到每一个本地IP。我们可以使用本地IP地址来获得前三个字节,并由此建立本地IP地址列表:

void sendMessage(String msg) async {
final ip = await myLocalIp();
final threeOctet = ip.substring(0, ip.lastIndexOf('.'));
for (var i = 1; i < 200; i++) {
_sendRequest('$threeOctet.$i', "?ip=$ip&msg=$msg");
}
}

void _sendRequest(String to, String path) async {
final client = HttpClient();
client.connectionTimeout = const Duration(seconds: 2);
try {
final resp = await client.get(to, 8080, path);
resp.close();
} catch (e) {}
}

在本例中,它只将消息发送到从x.x.x.1到x.x.x.199的IP地址上,但理论上,我们可以从1发送到255。

现在,我们可以向活跃的本地设备发送信息。左下方的图片是一个物理的iOS设备,右边的是一个macOS桌面应用程序。虽它们有不同的本地IP地址,但你可以看到他们可以互相发送消息。

​ 

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】


责任编辑:黄显东 来源: hackernoon.com
相关推荐

2023-11-08 07:51:11

RabbitMQ接收消息

2021-06-07 08:32:06

K8S集群Poddebug

2009-04-02 13:45:36

网关网络

2020-10-09 12:45:19

创建消息即时消息编程语言

2021-08-27 12:16:34

fastjarJAR文件Java

2020-10-09 15:00:56

实时消息编程语言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2019-05-14 12:30:07

PythonPygame游戏框架

2018-09-17 15:12:25

人工智能神经网络编程语言

2018-03-19 17:40:10

Python区块链

2019-10-28 20:12:40

OAuthGuard中间件编程语言

2011-07-21 08:51:15

2020-03-31 12:21:20

JSON即时消息编程语言

2023-08-31 12:13:39

防火墙本地网络流量

2023-02-13 14:47:32

人工智能机器学习ChatGPT

2022-01-17 09:22:42

SwiftUI App Store开源

2023-05-09 22:57:26

AI网络

2021-06-07 12:08:06

iOS Python API

2020-10-12 09:20:13

即时消息Access页面编程语言

2020-10-19 16:20:38

即时消息Conversatio编程语言
点赞
收藏

51CTO技术栈公众号