尝试在按下Enter键时发送消息

问题描述

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

我不确定,但是我认为问题出在客户端中的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并按Enter键(我希望它发送此消息,但不会发送)。然后,我输入my name is john,再次按Enter键。最后,我输入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]