2013-04-30 40 views
1

我有以下用於向服務器發送字符串的客戶端套接字。服務器沒有收到消息。可能是什麼,他們?Java Socket不向服務器發送消息

public void startClient() throws IOException { 

    Socket socket = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    InetAddress host = null; 
    BufferedReader stdIn = null; 

    try { 
     host = InetAddress.getByName("172.16.2.97"); 
     socket = new Socket(host, 52000); 

     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     String fromServer; 
     String fromUser = null; 
     //ClientHelper.unpackISO(); 
     fromUser = ClientHelper.createISO(); 
     if (fromUser != null) { 
      //System.out.println("Client - " + fromUser); 
      out.write(fromUser); 
      System.out.println("Sent message"); 
     } 


     while ((fromServer = in.readLine()) != null) { 
      System.out.println("Server - " + fromServer); 
      if (fromUser != null) { 
       //System.out.println("Client - " + fromUser); 
       out.println(fromUser); 
      } 
     } 
    } catch (ISOException ex) { 
     Logger.getLogger(ClientDemo.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (UnknownHostException e) { 
     System.err.println("Cannot find the host: " + host.getHostName()); 
     System.exit(1); 
    } catch (IOException e) { 
     System.err.println("Couldn't read/write from the connection: " +   e.getMessage()); 
     System.exit(1); 
    } finally { //Make sure we always clean up 
     out.close(); 
     in.close(); 
     stdIn.close(); 
     socket.close(); 
    } 
} 

方法ClientHelper.createISO()返回,其應該被髮送到服務器的字符串。不幸的是,服務器沒有得到任何字符串。問題可能是代理設置。如果是這樣怎麼解決的。或者它是我的代碼的另一個問題? 我的代碼有什麼問題?

+0

你有什麼異常嗎?你能從服務器接收嗎? – Fildor 2013-04-30 11:11:49

+0

什麼是你得到任何異常堆棧跟蹤的錯誤。 – 2013-04-30 11:12:42

+0

服務器如何知道它已收到所有字符串? – 2013-04-30 11:13:03

回答

1

寫入後必須刷新()流。套接字緩衝區,直到你得到一個完整的數據包,否則

+0

通過使用:out = new PrintWriter(socket.getOutputStream(),true); true表示printwriter將被自動刷新 – user2194528 2013-04-30 11:41:57

+0

這不會自動刷新write()方法....從文檔:autoFlush - 一個布爾值;如果爲true,println,printf或format方法將刷新輸出緩衝區 – rolfl 2013-04-30 11:44:16

1

檢查下面的第5行,你需要刷新你的輸出流。否則,服務器將無法獲得任何數據包,並且因爲它的阻塞,您將停留在第一個in.readLine()上。

fromUser = ClientHelper.createISO(); 
    if (fromUser != null) { 
     //System.out.println("Client - " + fromUser); 
     out.write(fromUser); 
     out.flush(); // FLUSH IT HERE, packet wont be sent until you flush your stream 
     System.out.println("Sent message"); 
    } 

還可以在循環中的out.write(fromUser)之後添加刷新。

+0

我試過了,但仍然無法工作。只有當我使用本地機器作爲服務器時,此套接字纔有效。但如果它是另一臺機器不起作用 – user2194528 2013-04-30 11:53:28

+1

您是否在客戶端程序上打印了「已發送消息」消息? – sverdianto 2013-04-30 12:09:13

+0

「發送消息」永遠不會被打印出來,因爲在從控制檯讀取數據之前'fromUser'將始終爲'null'。我沒有看到try語句中if語句的重點。你還說過「我只是沒有在服務器上收到任何消息」,你是否證實客戶端確實連接到服務器?另外,在'out.write(fromUser);'和'out.flush();'之前,有'out.write(「\ r \ n」)' – Adeeb 2013-05-01 00:56:46