2015-02-06 54 views
1

目標如何訪問NAT路由器後面的ServerSocket?

我正在爲Android聊天應用程序,我目前有2部電話,其最終必須爲幾千個用戶的工作測試。

問題

我得到一個ConnectionException說:「連接被拒絕」每當2個手機,請嘗試通過套接字連接到對方。

當前設計

每部手機開始一個ServerSocket,調用accept()方法等待一些插座來連接,並取其手機先發送一個消息,將創建一個客戶端的Socket。我確定我使用的IP地址是正確的(它們實際上都使用相同的外部IP)。 我相信問題是與端口。我隨機生成一個端口號,如果它可以自由使用,我說ServerSocket s = new ServerSocket(randomPortNumber)

我覺得是這個問題

我覺得這是什麼問題是這個端口號是一個坐在一個NAT路由器後面的來源。所以當一個Socket嘗試使用類似Socket socket = new Socket(ip, serverSocketRandomPortNumber)的方式連接到ServerSocket時,它將嘗試連接到NAT路由器併爲其提供此端口號,這將不起作用,因爲路由器本身不在此端口上偵聽,而是在後面的電話路由器是。

問題和想法

我的問題是,我該如何處理這個問題?

我必須改變我的設計嗎?

如果我必須,我想的一個替代設計是在Web主機上使用單個ServerSocket,並使用它將客戶端套接字發送的消息重定向到其他客戶端套接字。

我在PHP來實現服務器端沿着這些路線引用了一句: http://php.net/manual/en/sockets.examples.php

而且我仍然會使用Java客戶端。

回答

2

由於其中一部電話位於NAT路由器之後,除非在路由器上啓用端口轉發(或其他一些技術),否則無法啓動與其的任何連接。

實現聊天應用程序的常用方式是,所有客戶端都會連接到一個通用服務器。

你不必編寫自己的聊天服務器(除非你真的想)。我建議使用XMPP協議。已經制作的服務器列表here。在客戶端(Android),您可以找到您可以使用的庫,here

+0

所以你說的是,由於端口轉發並不可行,所以我們應該使用服務器。所以你可以告訴我服務器實際上做了什麼。它如何幫助在不同網絡中的兩個設備之間進行通信。請原諒我,因爲我在這裏提問。我剛接觸網絡,無法找到任何資源。 – 2016-03-08 07:48:47