2011-11-20 255 views
3

我正在使用socket = new Socket(host, port, InetAddress.getLocalHost(), clientPort);創建套接字。我想讓套接字在客戶端聽特定的端口。但是當我使用InetAddress.getLocalHost()時,我得到java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machineJava TCP套接字:java.net.ConnectException:connect:地址在本地計算機上無效,或端口在遠程計算機上無效

但是,當我使用InetAddress.getByName("localhost")它工作正常。但我需要在服務器端的機器的IP地址。所以當我使用socket.getInetAddress()我想要ipadress而不是127.0.0.1。

任何人都可以請幫忙。 我正在使用eclipse。這可能是防火牆問題嗎?

感謝

+0

我不太瞭解這個問題。也許你可以發佈代碼? Btw:它不是偵聽的套接字,它是'ServerSocket','Socket'連接到一個監聽服務器。 – home

+0

由於不清楚而感到抱歉。我使用套接字(字符串主機,int端口,InetAddress localAddr,int本地端口) 創建套接字,如果InetAddress是gt使用InetAddress.getLocalHost() –

+1

爲什麼地球上你試圖指定客戶端端口客戶端套接字? –

回答

0

聽起來像在客戶端和服務器端的職責混亂 - 聽起來就像你試圖讓兩個Java應用程序互相交談,通過TCP/IP在同一主機上,使用Java套接字。

如果這是你第一次需要使用一個ServerSocket在「服務器」應用程序來創建所有接口上監聽套接字的情況:

serverSocket = new ServerSocket(4444); 

然後,您應該能夠從連接的ServerSocket通過使用一個Socket「客戶」應用程序連接到本地主機:

clientSocket = new Socket("localhost", 4444); 

以下網頁看起來像他們覆蓋對此進行了詳細:

All About Sockets

希望有幫助。

+0

我沒有困惑。而不是創建clientSocket =新的套接字(「本地主機」,4444);我正在使用套接字(字符串主機,int端口,InetAddress本地地址,int本地端口) –

+0

@Android_enthusiast問題是*爲什麼*你這樣做,你已經基本上被問了三次,並沒有回答。可疑的是,如果你不這樣做,你就會覺得你需要這樣做。 – EJP

1

您正在使用Socket構造函數的四參數形式(非常不尋常;僅使用兩個參數形式並讓操作系統自行找出本地地址一側是正常的),所以您需要確保與套接字相關的兩個地址是兼容的,即可以通過這種方式路由數據包。特別是,如果任一端是本地主機,另一端必須也是,因爲該地址只通過回送網絡接口路由。

對於你(在客戶端)的最簡單的解決方法是切換到使用雙參數構造函數,讓操作系統找出它的其餘部分;它做得很好。 (如果服務器取決於來自特定端口號的客戶端連接,那太糟糕了,而且非常非常脆弱。)

相關問題