2013-04-10 94 views
5

我正在尝试为我的网络类创建一个java聊天应用程序。截至目前,我被困在尝试连接到不同路由器后面的人。我现在有我的项目的方式是我有一个客户端程序和一个服务器程序。客户端程序首先登录到服务器程序中,将其IP和端口记录在数据库中,然后服务器将其IP和端口返回给朋友列表。然后,客户端关闭与服务器的连接,并尝试使用服务器发回的信息连接到另一个客户端。到目前为止,我的程序只能连接到服务器并获取朋友的IP和端口,但是当我使用这些值连接到另一个客户端时,我无法连接。Java nat遍历聊天应用程序

socket = new Socket(); 
socket.setReuseAddress(true); 
socket.setKeepAlive(true); 
socket.setSoLinger(true, 10); 
socket.bind(new InetSocketAddress(Port)); 
socket.connect(new InetSocketAddress(host, SERVER_PORT)); 
reusePort = socket.getLocalPort(); 

以上是用于连接到服务器的java代码片段,下面是我在客户端做的事情。

ss = new ServerSocket(reusePort); 

所以,现在在技术上,我听我用来连接到与被登录并检索到另一个客户端,并与我的IP和端口NAT表服务器的同一端口上。我不知道我错过了什么,或者是否有某些协议或我必须做的事情。我已经看过TCP和UDP打孔,但我不确定这是如何实际完成的或如何实现它。

任何建议,将不胜感激。

+1

我看你已经接受一个答案,但似乎你想看看“孔Puching”。接受的答案并不真正回答你的问题,而是告诉你让你的应用程序的所有信息都通过你的服务器,而且你似乎想直接连接你的客户端。 – 2014-11-01 10:51:03

+0

嘿你找到你的答案了。请帮帮我。我有同样的问题。 – 2016-03-08 07:33:53

+0

[STUN,TURN,ICE library for Java]的可能重复(http://stackoverflow.com/questions/2039147/stun-turn-ice-library-for-java) – 2017-04-19 14:04:19

回答

1

如果您想发送消息,您需要在充当服务器的任何设备(任何创建套接字服务器的设备)上设置端口转发。端口转发在路由器上完成。您无法连接到其他客户端的原因是因为它们隐藏在路由器防火墙后面。他们对世界其他地方的地址实际上是路由器的地址,而不是物理计算机的地址。在他们的本地网络上,他们有一个不同的地址,然后世界其他地方看到,并且路由器根据地址转换表找出需要发送到外部世界的消息到客户端。根据你的体系结构,这意味着所有的客户端都需要让他们的路由器进行端口转发,这当然是不可行的(想象一下gtalk或目标要求用户做端口转发)。

更常见的体系结构是让服务器将消息转播到连接的客户端,并维护与谁交谈的查找表。这样就有一台服务器需要一个静态IP(或者是端口转发),并且所有用户都是连接到服务器套接字并从中读取消息的客户端。

有关描述第二种体系结构的实际代码,请参阅http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/chat-client-server.html。然后,运行服务器代码的计算机或者需要静态IP,或者如果它位于路由器后面,则需要来自正在监听的端口的流量以进行转发。

因此,在服务器代码上,您将绑定到从您的路由器分配的IP(类似192.168.1.2的某些端口,例如5000)。然后转到您的路由器配置页面(它可能是192.168.1.1,见http://www.wikihow.com/Port-Forward/Open-Ports-on-a-Linksys-Router),并将端口5000转发到地址192.168.1.2。

+0

感谢tigger!我现在确实已将我的服务器端口转发到我的路由器后面的X,我正在考虑切换到您建议的第二个体系结构(感谢您的链接,可能很难筛选到谷歌有时是大声笑),让每个客户端都维护一个单一连接到服务器和服务器,然后通过它向他们转发任何东西。但是,随着时间的推移,我将随着时间的推移而转换更多的内容。谢谢您的帮助。 – DarkLazar 2013-04-10 21:07:17

+0

好,所以你说的是,因为我们不能去到每一个路由器,所以我们通过并做端口转发。所以我们应该使用服务器并让它完成这项工作。 (如果我错了,请纠正我)。那么服务器到底会做什么?如果我的问题很奇怪,请原谅我,我是网络新手。 – 2016-03-08 07:32:03

+0

@DarkLazar Torrent客户端是如何工作的?或者他们使用其他方式来实现这一目标?有没有更简单的方法来实现这一点? (如图书馆) – goodbytes 2016-04-16 02:43:02

1

的互动式连接建立(ICE)协议结合各种NAT穿越实用程序,如STUN和TURN协议,以提供一个功能强大的机制,允许提供/应答协议基于诸如SIP和XMPP到穿越NAT。

该项目提供了ICE协议的Java实现,可供SIP和XMPP应用程序使用。该项目还提供了诸如套接字共享和伪TCP支持等功能。

ice4j由Jitsi社区维护。

ice4j