2013-10-29 37 views
1

我開發了一個在Java中使用TCP/IP進行聊天的應用程序。到目前爲止,它在同一臺計算機上運行服務器和客戶端時完成了這項工作,但是我想通過局域網工作。通過局域網與TCP/IP進行Java聊天

我發現我將在我的路由器上使用端口轉發,用於我在客戶端&服務器中使用的端口,並將其轉發給我的機器(即服務器)的IP。我還發現我會小心防火牆。

在我的virgin媒體中心路由器上,我使用端口(4444)將協議TCP轉發到本機的本地IP(192.168.0.21)。我也確保沒有端口被阻塞。

對於防火牆,我已確認Windows防火牆未啓用並關閉卡巴斯基反病毒防火牆。

到目前爲止,這並不允許我通過局域網與我的VMware機器進行通信。

這是套接字和服務器套接字的代碼;

客戶:

int portNumber = 4444; 
InetAddress host = InetAddress.getLocalHost(); // I also did try changing the host to a String and making host = InetAddress.getLocalHost().getHostAddress(); 
Socket link = new Socket(host, portNumber); 

服務器:

int portNumber = 4444; 
ServerSocket serverSocket = new ServerSocket(portNumber); 
link = serverSocket.accept(); 

任何想法,我做錯了什麼,或者失去了一些東西?

回答

2

與該代碼(InetAddress host = InetAddress.getLocalHost();)你的客戶方將隨時聯繫本地主機,而這顯然不是你想要的(但爲什麼它在本地的解釋...

我可以在客戶端 - 服務器通信建議官方Oracle tutorial

假設你的遠程系統的IP地址192.168.0.100是,你的代碼將

int portNumber = 4444; 
String host = "192.168.0.100"; // Socket also has a constructor that accepts 
           // as String where you can either input a hostname or 
           // an IP address 
Socket link = new Socket(host, portNumber); 

插座的Javadoc here

編輯:在你的程序中的主要缺陷是,你有根據Javadoc

返回本地主機的地址使用InetAddress.getLocalHost()。這是通過從系統中檢索主機的名稱,然後將該名稱解析爲InetAddress來實現的。

強調我的。所以是的,你的程序將與本地計算機一起工作,但是與遠程計算機的而不是。我的答案的實質是我使用一個字符串,但我使用本地主機...

+0

哦對不起我忘了提及,我也沒有嘗試改變主機一個字符串,並使主機= InetAddress.getLocalHost()。getHostAddress();這應該會導致與上述建議相同的功能,但這仍不能解決問題 – Adrian

+0

但是...您不希望連接到本地主機嗎? – Ingo

+0

不幸的是你的方式也不行:/因爲我的虛擬機的ping命令超時,所以我決定看看父親的電腦,把他的主機設置爲「192.168.0.8」,但它沒有工作。無論如何,非常感謝你對這個和平進行調查。 – Adrian