簡體   English   中英

Java套接字客戶端服務器響應應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM