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