关于javaSocket外网通信的问题

关于javaSocket外网通信的问题,第1张

路由器发给局域网电脑的IP是内网IP,你连接的是路由器处于外网的IP,数据发送到路由器上,路由器并不知道你需要连接的是内网的哪台电脑,于是连接失败。
解决方法就是做路由器端口映射。让路由器吧指定端口上的连接全部都转发到指定的内网电脑上。这样内网的电脑才能对连接做出响应。

路由器的端口号 与 你机器的端口号 是不一样的(你做了端口映射,对方没有,他接收不到)
可以有个中间服务器,对方电脑先与服务器通信(告知Ip和端口),你与服务器通信(获取对方的Ip和端口),也就是NAT穿透;
路由端如何支持UPNP协议的话,应该不需要做端口映射;你可以看看UPNP协议

关键在路由器上!如果想让你的程序从既能从内部局域网访问,也能外部网络访问,那你必须:
1)在路由器增加一个路由项,这个路由项由将{外网IP:端口}映射到{你计算机内网IP:端口}
2)你的计算机上仍然使用{内网IP:端口}

首先你要明白路由是不是共享式NAT上网的,也就是说router port nat出去的数据是一直堆叠或者持续变动的,而不做端口映射基本没有实现的可能!
当然如果是静态NAT,那么直接做静态NAT就可以了!
如楼上灰鸽子,是直接通过本地服务端(中灰鸽子端)连接广域网客户端(控制端),然后服务端和建立的联系。如通过80端口出数据,穿透防火墙等等。
你可以尝试修改数据包出去的port,同时在两个端进行修改!
-------------
抓取到数据包的时候注意地址段,关键在于让路由到router nat到数据包的时候,能找到你的主机A或者W。
你可以参照一些三层更新之类的软件。

可以
但是会困难很多
就像qq这样的软件
首先就是把ttl设的大一些
这样保证过路由的时候不会把你的包扔了
其次就是一个nat的问题,如果是你和固定ip的服务器连接还好,就怕是两个客户端点点互联,对等体的连接是有些困难的,因为所有的pc几乎都在nat后面
比如你是19216801
而我是19216802
可是杂俩根本就不在一个网段,
这两个地址都是只是nat后面的保留地址
过nat的时候,可能你实际是123111
而我是203111
这次是这样
下次还会变
dhcp么
两个进程要想通信,就得知道彼此的真实socket
两个程序怎么知道彼此的ip呢?
这就需要一个固定ip的第三点(中心点服务器)
你和我上来都进行对固定ip的第三点连接
第三点就会拿到你和我的nat前面的真实地址
然后第三方
把我的真实地址告诉你
把你的告诉我
这样咱们就可进行点对点了
这就像我不知道你的电话,你也不知道我的电话,咱们怎么联系
只能通过路人甲,这个路人甲的电话是固定且已知的,咱们都先给路人甲打电话,然后他手机就能显示你的和我的号码了,他再把彼此的号码发给对方,双方就知道对方的号码了,就可以互相打电话了
比如tcp与udp的打洞和穿洞
就是这种nat穿越技术
这是p2p的基础
也是真实网络环境下点点互联的一个比较普遍的方案

Socket 可以实现内网计算机与外网上计算机的信息交换,前提是:内网与外网之间的网关(路由)允许你的计算机使用指导的协议(TCP或UDP)和端口与外网计算机连接。可以用任何支持Socket编程的语言实现Socket,包括Java


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13353973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存