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