Matlab公网通信的实现(NAT123实现内网穿透)

说了好久要做一次公网通信的实验,这次因为一个博友的评论,搞了一天才有点儿成效,在此分享。
(关于公网与内网的相关说明请看博客:MATLAB实现简单的聊天软件)

NAT123下载

软件下载地址:NAT123
下载整合版的就行,方便好用,傻瓜式安装:
Matlab公网通信的实现(NAT123实现内网穿透)_第1张图片

NAT123映射

打开软件,界面如下(做的和以前的QQ一样),点击添加映射:
Matlab公网通信的实现(NAT123实现内网穿透)_第2张图片
根据下面的提示进行设置:
Matlab公网通信的实现(NAT123实现内网穿透)_第3张图片

通讯协议选择说明

Maltab实现了TCP和UDP两种协议,但是在NAT穿透的环境下,Matlab的TCP实现非常鸡肋,所以使用UDP协议

(下面一段解释为啥TCP不行,不需要了解的直接跳到下一节)

一般情况下,TCP的server端应该只需指定监听的端口,然后与请求连接的第一个客户端进行连接,记录客户端的IP地址和端口。
Matlab不一样,你必须指定要连接客户端的IP和端口,看定义即可:
在这里插入图片描述
而这些NAT穿透软件所谓的穿透,根据我的理解是一种转发过程,从外部发来的消息,他会通过某个内部端口发送给你的绑定内部端口。
难以理解的话,下面用python的例子来解释,这个是经过内网穿透的TCP的python实现结果(也就是说,python和C++可以用):
Matlab公网通信的实现(NAT123实现内网穿透)_第4张图片
上面我用客户端程序,连接了服务器4次,可以看到,服务器连接到的IP地址实际上是回环地址127.0.0.1,而端口则是不固定的,端口值总是在变大(根据我的实验,变大的速度是固定的)
那么这时候Matlab的TCP就不能用了,因为remoteport总是在变化,所以只能采用UDP来做。

确定外网域名的IP

(注此步可有可无,不需要的自行转下节)
找到外网的域名(我的是510ca336.nat123.fun):
Matlab公网通信的实现(NAT123实现内网穿透)_第5张图片
打开命令行,输入 ping + 域名,可以看到外网的IP:
Matlab公网通信的实现(NAT123实现内网穿透)_第6张图片

进行UDP通信

准备工作完成了,copy下面的代码:

%% 定义两个UDP对象
% UDP1与公网进行通信,因此远程主机和端口为公网的地址和端口
% 远程主机地址可用 域名和IP地址 两种形式
% UDP2接收来自NAT123公网的信息,而NAT123通过某内部端口转发给绑定的端口

%UDP1=udp('47.98.243.161','RemotePort',39748,'LocalPort',8831);
UDP1=udp('510ca336.nat123.fun','RemotePort',39748,'LocalPort',8831);
UDP2=udp('localhost','RemotePort',8854,'LocalPort',8086);

%% 打开两个UDP对象
fopen(UDP1);
fopen(UDP2);

%% UDP1发送信息 UDP2接收信息
sendData=unicode2native('公网通信');%把要发送的汉字转换为ASCII码表示形式
fwrite(UDP1,sendData);
recData=fread(UDP2);
recData=native2unicode(recData);%把接收到的ASCII码转换为Unicode编码形式
sprintf(recData')% 打印接收的字符串

%% 关闭TCP连接,释放内存
fclose(UDP1);
fclose(UDP2);
clear UDP1;
clear UDP2;

把代码进行如下修改:
Matlab公网通信的实现(NAT123实现内网穿透)_第7张图片
外网域名、IP、端口在NAT123映射小节都有说明,内网端口也是上面定义的,因此就不详述了。

通信结果展示

效果如下:
在这里插入图片描述
完成了一次通信过程。

双向通信的思考

  1. 上面只是单向的通信过程,这也是UDP的缺点。
  2. 从UDP1发送的消息可以通过NAT123的公网转发到UDP2,因为UDP2监听了绑定端口。
  3. 而UDP2的消息传送到NAT123的公网时,消息中的目的地址只是本地IP和端口,因此NAT123不知道转发给谁。
  4. 我感觉,这个问题应该只能用TCP来解决,欢迎大家讨论。
  5. 仔细想了一下,用UDP的话,建立两个映射,使用四个UDP也可以勉强实现双向通信

你可能感兴趣的:(MATLAB代码)