2015-07-19 93 views
1

我想在Eclipse中使用java做一個簡單的服務器和客戶端程序,但每當我運行程序兩個控制檯輸出null。我不知道爲什麼會發生這種情況。我讀到一個常見的問題是我已經創建了一個服務器實例,並且正在嘗試創建另一個實例,但我相信那不是問題。我也讀過,我可能沒有root訪問權限,並且需要使用高於1024的端口,所以我做了,而且我仍然有同樣的錯誤。Java套接字測試返回空值

Server代碼:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Socket_Server_Side { 
    public static void main(String [] args) throws Exception { 
     Socket_Server_Side server = new Socket_Server_Side(); 
     server.run(); 
    } 

    public void run() throws Exception { 
     ServerSocket SvrSocket = new ServerSocket(1025); 
     SvrSocket.setReuseAddress(true); 
     Socket socket = SvrSocket.accept(); 
     InputStreamReader Ir = new InputStreamReader(socket.getInputStream()); 
     BufferedReader Br = new BufferedReader(Ir); 

     String message = Br.readLine(); 
     System.out.println(message); 

     if (message != null) { 
      System.out.println("Message succesfully sent and recieved!"); 
     } 
    } 
} 

客戶端代碼:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.Socket; 

public class Socket_Client_Side { 
    public static void main(String [] args) throws Exception{ 
     Socket_Client_Side client = new Socket_Client_Side(); 
     client.run(); 
    } 

    public void run() throws Exception { 
     Socket socket2 = new Socket("localhost", 1025); 
     PrintStream Ps = new PrintStream(socket2.getOutputStream()); 
     Ps.println("Hello Server"); 
     InputStreamReader Ir = new InputStreamReader(socket2.getInputStream()); 
     BufferedReader Br = new BufferedReader(Ir); 

     String message = Br.readLine(); 
     System.out.println(message); 
    } 
} 
+1

這裏沒有'套接字測試'。您的客戶**打印**爲空,因爲它正在從已經被對等關閉的連接中讀取而沒有發送任何內容。 – EJP

+1

儘管存在缺陷,但我不確定爲什麼這是一個可怕的問題......它具有易於編譯的代碼,並且至少是從未使用套接字編程的人的症狀。 – Makoto

+0

你的代碼的一些注意事項:Java中的類名應該使用[PascalCase](https://pl.wikipedia.org/wiki/PascalCase)和變量shoud使用[camelCase](https://en.wikipedia.org/wiki /駱駝香菸盒)。 – Turing85

回答

3

從我可以告訴,你的代碼工作正常。您的客戶打印null的原因是由於它未收到任何輸入本身

讓我們來描述一下你在高層溝通的場景。

你有兩個程序;服務器和客戶端。服務器正在主動偵聽對它的任何輸入,並且客戶端將輸入發送到服務器。這個過程(迄今爲止)是單向的,而且我們擁有代碼結構的方式,我們只會向服務器寫任何東西。

現在,您有兩個與套接字通信的渠道:輸入和輸出。回想一下,我們正在向服務器發送數據,並且服務器沒有向客戶端發送任何數據。這意味着:

  • 服務器應該只關心輸入,並沒有任何與輸出
  • 客戶端應該只關心輸出,而不是與輸入輸入。

這就是說,這個代碼在客戶端是多餘的:

InputStreamReader Ir = new InputStreamReader(socket2.getInputStream()); 
BufferedReader Br = new BufferedReader(Ir); 

String message = Br.readLine(); 
System.out.println(message); 

這樣做的原因是,你的客戶沒有進來給它的任何輸入,因此任何消息說突然顯示出來確實是一件奇怪的事情。

+0

感謝您的建議,如果我刪除了這些代碼行,我的程序能否按預期工作? – programmer

+0

您不會再從客戶端獲得null(服務器不會在我的環境中輸出null)。 – Makoto

+0

服務器在任何環境中都不打印空。它包含一個測試,以防止它做到這一點。 – EJP