[英]Java socket client server response application
我正在嘗試編寫一個簡單的客戶端服務器,該服務器將回顯附加了字符串“ Response:”的用戶請求。
我看過他們的類似問題,但我無法理解發生了什么。 我正在嘗試編寫此文件,但無法使其正常工作。 主要是因為我對正在發生的事情感到非常困惑。
我已盡我所能來注釋我的代碼,以嘗試解釋我的想法。 我不確定運行此問題並輸入消息時沒有什么反應,但沒有得到答復
客戶
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();
}
}
從客戶端代碼中刪除sock和serverSock並使用s.getInputStream。
套接字在兩側都是雙向的,因此就像在發送回消息時不需要服務器上的新套接字一樣,您也不需要在客戶端上接收新消息的套接字。
編輯
另外,“關閉返回的OutputStream將關閉關聯的套接字。” (有關getOutputSteam的文檔),因此請不要關閉編寫器,只需刷新它即可。
Server可以其當前形式工作,並且Client開始進行較小的更改(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塊內使用close是不安全的,因為只要有例外,這些行就不會運行(此外,如果您使用任何類型的智能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。 在嘗試一小段代碼時,我不建議在模糊的日志中隱藏異常。 實際上,我通常只是到處寫“ throw Exception”(包括main
,這也是可能的),然后讓JRE將所有內容轉儲到我的臉上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.