2017-05-03 204 views
0

我正在嘗試編寫一個簡單的客戶端服務器,它會向用戶請求回送帶有字符串「Response:」的用戶請求。Java套接字客戶端服務器響應應用程序

他們是類似的問題,我看過,但我無法理解發生了什麼。我試圖寫這個,但不能讓它工作。主要是因爲我對發生的事情非常困惑。

我已經評論過我的代碼,因爲我可以嘗試解釋我認爲正在發生的事情。 我不知道是什麼問題,當我運行這一點,並進入一個消息我沒有得到響應

客戶

public class Client { 

public void go() { 

    try { 
     //Create a Socket with ip and port number 
     Socket s = new Socket("127.0.0.1", 4242); 

     //Get input from user 
     Scanner in = new Scanner(System.in); 
     System.out.println("Please enter a message"); 
     String clientMessage = in.nextLine(); 

     //Make a printwriter and write the message to the socket 
     PrintWriter writer = new PrintWriter(s.getOutputStream()); 
     writer.write(clientMessage); 
     writer.close(); 

     //StreamReader to read the response from the server 
     InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
     BufferedReader reader = new BufferedReader(streamReader); 

     //Get the response message and print it to console 
     String responseMessage = reader.readLine(); 
     System.out.println(responseMessage); 
     reader.close(); 

    } catch (IOException ex) { 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

public static void main(String[] args) { 
    Client c = new Client(); 
    c.go(); 
} 

} 

服務器

public class Server { 

public void go() { 
    try { 
     //Make a ServerSocket to listen for message 
     ServerSocket ss = new ServerSocket(4242); 

     while (true == true) 
     { 
      //Accept input from socket 
      Socket s = ss.accept(); 

      //Read input from socket 
      InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
      BufferedReader reader = new BufferedReader(streamReader);     
      String message = reader.readLine(); 

      //get the message and write it to the socket as response 
      PrintWriter writer = new PrintWriter(s.getOutputStream()); 
      String response = "Response : " + message; 
      writer.println(response); 
      writer.close(); 

     } 
    } catch (IOException ex) { 
     Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public static void main(String[] args) { 
    Server server = new Server(); 
    server.go(); 
} 

} 
+1

當客戶端充當客戶端和服務器時,有點困難,但首先您的客戶端和服務器客戶端代碼使用相同的端口號。大問題。 – jiveturkey

+0

你告訴我們你想要做什麼,並且向我們展示了代碼,但是你沒有告訴我們發生了什麼問題。毫無疑問。 「我無法理解正在發生的事情」不是一個問題。 –

+0

@ Mike Nakis當我嘗試首先得到迴應 –

回答

1

刪除襪子serverSock從你的客戶端代碼中使用s.getInputStream。

套接字在雙方都是雙向的,所以當您發送回消息時您不需要在服務器上新建一個套接字,您不需要在客戶端上接收套接字。

編輯

另外, 「關閉返回的OutputStream將關閉關聯的插座。」 (文檔爲getOutputSteam),所以不要關閉寫入器,只需刷新它。

服務器可以在其目前的形式工作,和客戶端開始與小的變化(的println和flush)工作:

//Create a Socket with ip and port number 
Socket s = new Socket("127.0.0.1", 4242); 

//Get input from user 
Scanner in = new Scanner(System.in); 
System.out.println("Please enter a message"); 
String clientMessage = in.nextLine(); 

//Make a printwriter and write the message to the socket 
PrintWriter writer = new PrintWriter(s.getOutputStream()); 
writer.println(clientMessage); // <- println 
writer.flush();    // <- flush 

//StreamReader to read the response from the server 
InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
BufferedReader reader = new BufferedReader(streamReader); 

//Get the response message and print it to console 
String responseMessage = reader.readLine(); 
System.out.println(responseMessage); 
reader.close(); 
writer.close();    // <- new location for close (*) 

(*)主try塊內使用接近不認爲是安全的,因爲無論何時有一個例外,這些行不會運行(另外,如果您使用任何一種智能IDE,它可能指出Socket對象本身和掃描器根本沒有關閉)。延伸閱讀:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

所以最終客戶端可以,而這個樣子,下面有更多的「當代」的方法:

try (
    Socket s = new Socket("127.0.0.1", 4242); 
    Scanner in = new Scanner(System.in); 
    PrintWriter writer = new PrintWriter(s.getOutputStream()); 
    InputStreamReader streamReader = new InputStreamReader(s.getInputStream()); 
    BufferedReader reader = new BufferedReader(streamReader); 
) { 
    //Create a Socket with ip and port number 

    //Get input from user 
    System.out.println("Please enter a message"); 
    String clientMessage = in.nextLine(); 

    //Make a printWriter and write the message to the socket 
    writer.println(clientMessage); 
    writer.flush(); 

    //StreamReader to read the response from the server 

    //Get the response message and print it to console 
    String responseMessage = reader.readLine(); 
    System.out.println(responseMessage); 
} catch (IOException ex) { 
    ex.printStackTrace(); // (**) 
} 

(**)我絕對相信你沒有檢查日誌,否則你會知道關於提前關閉Socket。當試驗一小段代碼時,我不會建議在晦澀難懂的日誌中隱藏異常。實際上,我通常只是在所有地方寫上「拋出異常」(包括main,這也是可能的),並讓JRE把所有東西都轉移到我的臉上。

+0

我已經刪除了這個,但現在什麼都沒有hame –

+0

@MichaelGrinnell是的,您也需要println,正如WalterM所建議的 – tevemadar

+0

非常感謝,您已經清除了我的分配,我將在未來在房間中清除異常: ) –