尝试在按下回车键时发送消息

Trying to make send a message when the enter key is pressed

我正在尝试向服务器发送消息。我的问题是客户端一直在等待输入并且在最后一条消息告诉它终止(即“再见”)之前永远不会将其发送到服务器。客户端终止后,服务器将收到消息。但我希望服务器在客户端每次按下回车键时都能收到消息。

我不确定,但我认为问题出在客户端中的Bufferedwriter,因为如果我使用浏览器连接到服务器,服务器会收到所有浏览器信息。示例如下:

Connect to this server name: localhost and port: 121
Connection from client: Socket[addr=/0:0:0:0:0:0:0:1,port=61942,localport=121]
From client > GET / HTTP/1.1
From client > Host: localhost:121
From client > Connection: keep-alive
From client > Cache-Control: max-age=0
From client > Upgrade-Insecure-Requests: 1
From client > User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
...

相关服务器代码:

try {
    sers = new ServerSocket(port);
    client = sers.accept();
    
    reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    
    boolean clientIsOnline = true;
    
    while (clientIsOnline) {
        print("Connection from client: " + client);
        
        while((msg = reader.readLine()) != null) {
            print("From client > " + msg);
            if(msg.toLowerCase().equals("bye"))
                print("Client left, server closed");
                clientIsOnline=false;
        }
        ss.close();
        reader.close();
        writer.close();
    }
    
} catch(Exception e) {
    print("Error starting  server: ");
    e.printStackTrace();
}

相关客户端代码:

public Client(String adr, int port) {
    this.adr=adr;
    this.port=port;
    try {
        c=new Socket(adr, port);
        r = new BufferedReader(new InputStreamReader(c.getInputStream()));
        w = new PrintWriter(new OutputStreamWriter(c.getOutputStream()));

    } catch (IOException e) {
        e.printStackTrace();
    }
}

发送消息的客户端方法

private void msgToServer(String msg) {
    try {
        w.write(msg);
        w.flush();
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    if(msg.toLowerCase().equals("bye")) {
        print("I am out, bye");
        try {
            c.close();
            r.close();
            w.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端主要方法:

public static void main(String[] args) {

        int port=121;
        String msg =null;

        Scanner sc = new Scanner(System.in);
        Client c = new Client("localhost", port);

        System.out.println("Write something to server");
        while(true) {
            c.msgToServer(sc.next());
        }
    }

我还尝试使用 PrintWriter 而不是 BufferedWriter,还尝试添加 true 关键字作为参数,例如

new PrintWriter(new OutputStreamWriter(c.getOutputStream()), true);

只是举例说明使用我的客户端的情况。

我输入 hello 回车(我希望它能发送,但它没有)。然后我输入 my name is john 再次回车。最后我输入 bye 我预计:

From client > hello
From client > my name is john 
From client > bye

我得到的是:From client > hellomynameisjohnbye

我相信客户端读取输入时会消耗换行符,因此需要在发送到服务器时添加它。在客户端方法中:

private void msgToServer(String msg) {
    try {
        // re-introduce newline:
        w.println(msg);

    [SNIP]