Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按enter键时尝试使其发送消息_Java_Java Stream_Java Io - Fatal编程技术网

Java 按enter键时尝试使其发送消息

Java 按enter键时尝试使其发送消息,java,java-stream,java-io,Java,Java Stream,Java Io,我正在尝试向服务器发送消息。我的问题是,客户端一直在等待输入,直到最后一条消息通知它终止(即“bye”)时才将输入发送到服务器。客户端终止后,服务器将接收消息。但是我希望服务器在每次客户端按下enter键时都能收到消息 我不确定,但我认为问题在于客户端中的Bufferedwriter,因为如果我使用浏览器连接到服务器,服务器将接收所有浏览器信息。示例如下所示: Connect to this server name: localhost and port: 121 Connection from

我正在尝试向服务器发送消息。我的问题是,客户端一直在等待输入,直到最后一条消息通知它终止(即“bye”)时才将输入发送到服务器。客户端终止后,服务器将接收消息。但是我希望服务器在每次客户端按下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
点击回车键(我希望它发送这个,但它没有)。然后我输入
我的名字是john
再次点击回车键。最后我键入
bye
我例外:

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

我得到的:
来自客户端>hellomynameisjohnbye

我相信当客户端读取输入时新行正在被使用,因此在发送到服务器时需要添加新行。在客户端方法中:

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

    [SNIP]

就是这样。如果你知道我花了多长时间看这段代码。我从来没有想过。有没有任何I/O流会自动为您执行此操作?我不知道一个参数?如果您愿意,可以使用
println()
方法。。。我已经更新了答案。