2013-04-10 93 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