2012-04-13 58 views
1

我需要建立一個應用程序,它可以接收來自網絡的數據並使用這些數據做一些不相關的事情。Java中的套接字...?

下面是一段代碼,以表明我在做什麼。

在服務器端:

static Socket client = null; 
static ServerSocket ss = null; 

if (ss != null) { 
       ss.close(); 
      } 
      ss = new ServerSocket(5513); 
      isrunning = true; 
      System.out.println("Waiting for client..."); 
      client = ss.accept(); 
      System.out.println("Client accepted."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 

和客戶端:

Socket client = null; 
PrintWriter out = null; 
        try {        
         client = new Socket("hostname", 5513); 
         out = new PrintWriter(client.getOutputStream(), true); 
    } 

請注意,這只是一塊代碼。代碼中沒有錯誤。

運行服務器端代碼後,它正確地等待客戶端連接。

現在問題來了。只要我嘗試從客戶端連接,我就會收到「連接被拒絕」 - 錯誤。

但是,我在互聯網上發現了一些東西,告訴我嘗試從客戶端進行遠程登錄。例如,讓服務器端IP爲192.168.1.1。所以,使用這個命令後:

telnet 192.168.1.1 5513 

我實際上得到了一個與服務器的連接。該命令將啓動一個空白屏幕,並且在按下Enter鍵(通過調試進行檢查)後,手動鍵入命令行中的所有內容都將發送到服務器端。

所以,我可以手動連接到服務器端併發送一些數據,但我的代碼拒絕連接。

任何知道我在做什麼的人都是錯的?

+0

我不確定你爲什麼失敗,但是我使用這兩個教程輕鬆運行套接字:http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in。 html 和http://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt 2012-04-13 17:05:43

+0

@HannahMitt,他忘了'while'循環。服務器甚至不會在超過一秒的時間內監聽連接。一旦服務器建立一個連接,它就完成了,不再聽了。 – 2012-04-13 17:35:20

+0

正如我所說,這只是一段代碼。實際上,我正在使用while循環。此外,accept()方法將等待連接建立,所以我可以讓服務器等待幾個小時來建立第一個連接。之後,它將循環到另一個連接的開始。 – 2012-04-14 11:48:01

回答

3

這是你實際使用的代碼嗎?

client = new Socket("hostname", 5513); 

嘗試將其更改爲:

client = new Socket("192.168.1.1", 5513); 
+0

工作正常!謝謝。 – 2012-04-13 17:27:47

0

你實際上並沒有在客戶端的Socket對象中使用「hostname」嗎?

它應該是192.168.1.1。

0

你在Windows?如果是的話,您是否已將java.exe和javaw.exe添加到防火牆,並啓用了入站和出站?並且您是否將5513的規則添加到您的防火牆?

如果是Windows但沒有防火牆設置,那是您的答案,請打開防火牆。

2

client = new Socket("hostname", 5513); 主機名稱需要表示您要連接的IP地址。如果您嘗試連接到自己,它將是「本地主機」

另外,服務器在所有時間都沒有監聽客戶端,因此必須有while循環,以便服務器偵聽並接受連接。

while (true) { 
    client = ss.accept(); 
    out = new PrintWriter(client.getOutputStream(), true); 
    //You should probably assign it to a seperate thread to handle stuff for this client 
} 

我應該解釋爲什麼你會得到那個特定的錯誤。當某些內容表示連接被拒絕時,通常意味着您要連接的IP地址知道您正在發送連接,並且正在阻止它,因爲它沒有監聽該連接。基本上,當服務器關閉時,您停止監聽客戶端,因此該端口上的任何內容都將被阻止。當然,另一種情況可能是Java在你的防火牆上被阻塞了,應該有一個例外。雖然這很少是如果你想要完成的是LAN。

+0

這很尷尬,用實際工作的IP地址替換主機名。 – 2012-04-13 17:27:18

+0

輸入主機名適用於局域網連接,因爲我之前已經測試過,它確實建立了連接。但爲了提高連接的準確性,我會堅持使用IP地址。更不用說那種方法更直接和直接。我只會使用主機名進行網站連接。唯一的例外是「localhost」,意思是「我的電腦的IP地址」 – 2012-04-13 17:32:26