Java 按enter键时尝试使其发送消息
我正在尝试向服务器发送消息。我的问题是,客户端一直在等待输入,直到最后一条消息通知它终止(即“bye”)时才将输入发送到服务器。客户端终止后,服务器将接收消息。但是我希望服务器在每次客户端按下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
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()
方法。。。我已经更新了答案。