我正在尝试创建一个应用程序,它将计算单击按钮的次数。此客户端将连接到服务器,当用户单击该按钮时,它应该递增服务器上的计数器。然后,服务器应将当前的点击量发送回客户端。但那是我遇到一些问题的地方。
这是相关的客户端代码。
public void actionPerformed(ActionEvent arg0) {
try {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String target = "";
bw.write("increment" + "\n");
bw.flush();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String id = br.readLine();
System.out.println("test: " + id);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
客户停在:
String id = br.readLine();
我只想从服务器获取输出。
这是相关的服务器端代码。
public void run() {
try {
while (true) {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is); //Create the input Streams
BufferedReader br = new BufferedReader(isr);
String input = br.readLine();
System.out.println("got input");
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
System.out.println("wrote to out");
if(input.equals("increment" + "\n")) {
totalBets++;
System.out.println("inif");
bw.write(totalBets);
System.out.println("wrote");
bw.flush();
System.out.println("flushed");
System.out.println("Total Bets: " + totalBets);
}
}
} catch (IOException e) {
log("Error handling client# " + clientNumber + ": " + e);
} finally {
try {
socket.close();
} catch (IOException e) {
log("Couldn't close a socket, what's going on?");
}
log("Connection with client# " + clientNumber + " closed");
}
}
我发现它也停在这里:
String input = br.readLine();
我只是想从客户端获取bw.write(“imcrement”),因此服务器可以递增计数器,并发回总点击次数。
任何帮助?
谢谢。
答案 0 :(得分:0)
您需要在客户端的套接字上设置TCP_NODELAY。默认情况下,数据将被缓冲,直到它将填满整个数据包。当缓冲区已满时,将发送数据包。但是,对于此协议,您希望立即发送数据,以便服务器可以响应。
我在测试和调试网络代码时经常使用wireshark。它将准确显示发送和接收的数据包。 (请注意,在Windows上,您无法从环回接口捕获;这是Windows的限制,不适用于其他系统)
答案 1 :(得分:0)
您正在使用BufferedWriter.write(int)
撰写totalBets
值。
将值解释为单个字符。因此,例如,如果totalBets
为65,则会写入字符'A'
!
此外,它不会添加换行符。因此客户端读取'A'
但尝试读取更多字符,因为它试图读取整行。请记住,您必须编写行来读取行。
因此,您应该将编写totalBets
的部分替换为:
bw.write(String.valueOf(totalBets));
bw.newLine();
另外请记住,正如我在评论中指出的那样,你必须用\n
(或者最好是BufferedWriter.newLine()
)来写一行,但是当你读到另一边的那一行时,该行分隔符被剥离,所以你应该比较你期望的字符串而不用 \n
。