我有一个服务器和客户端应用程序。它们都使用BufferedWriter-InputStreamReader-InputStream来读取来自服务器或来自客户端的信息
我有工作所以我可以使用
bw.write("command");
在服务器端执行命令,并将信息输出回客户端。
然而,对于两个不同的命令,我遇到了两次麻烦。这是代码:
服务器端代码:
public void run() {
try {
while (true) {
socket.setTcpNoDelay(true);
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String input = br.readLine();
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
if (input.equals("increment")) {
bw.write(String.valueOf(totalBets.incrementAndGet()));
bw.newLine();
bw.flush();
} else if(input.equals("generate")) {
Random rand = new Random();
bw.write(String.valueOf(rand.nextDouble()*99));
bw.newLine();
bw.flush();
}
}
}
客户端代码:
public void actionPerformed(ActionEvent arg0) {
try {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
bw.write("increment" + "\n");
bw.flush();
String id = br.readLine();
bw.write("generate");
bw.flush();
String roll = br.readLine();
}
}
第一个字符串id
获取运行bw.write("increment")
的输出,但是当我尝试运行bw.write("generate")
时,它会在运行该行时冻结:String roll = br.readLine();
任何帮助?
谢谢!
答案 0 :(得分:0)
我建议您使用PrintWriter
而不是BufferedWriter
。使用BufferedReader
进行读取而不会在底层操作系统的缓冲区中保留数据,因此它们将在应用程序级别进行缓冲,但是对于写入,您希望它在发送一个完整的&#39后立即进行读取;命令&#39 ;.
使用PrintWriter
,您还可以使用println
来解决您的问题。
答案 1 :(得分:-1)
通过创建多个BufferedReaders,您将丢失数据或冒险。在插座的使用寿命中使用相同的一个。同上BufferedWriter。