gpt4 book ai didi

java - 带套接字的 BufferedReader 和 BufferedWriter

转载 作者:行者123 更新时间:2023-11-30 06:49:54 25 4
gpt4 key购买 nike

天才。

我想在Java中使用套接字。

这是我的服务器端代码的一部分:

ServerSocket ss = new ServerSocket(this.portNum);
while (!ss.isClosed()) {
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

System.out.println("reading");
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println("read");

System.out.println("writing");
bw.write(this.wsp.parse(new String(sb.toString())).toJSONString());
bw.newLine();
bw.flush();
System.out.println("wrote");

bw.close();
br.close();
socket.close();
}
ss.close();

我的客户端(测试)代码是:

Socket socket = new Socket("143.248.135.60", 44450);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

System.out.println("writing");
bw.write(str);
bw.newLine();
bw.flush();
System.out.println("wrote");

System.out.println("reading");
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
System.out.println("read");

br.close();
bw.close();
socket.close();

双方在打印“reading”后暂停。

我的代码有什么问题吗?

提前感谢您的帮助!

最佳答案

此时您的应用程序在服务器站点上被阻止:

while ((line = br.readLine()) != null) {
sb.append(line);
}

您的服务器将读取行,直到源流关闭(当到达流末尾时br.readLine()将返回null)。但这并没有发生。看起来您只期望这里只有一行,所以尝试这个而不是服务器端的循环:

System.out.println("reading");
String line = br.readLine();
System.out.println("read");

现在关于客户端的名称循环:服务器在写入自己的数据后将立即关闭流和套接字。因此,在读取第一行后,br.readLine() 将在客户端返回 null。所以它会做你所期望的事情。但如果您按照我为服务器端建议的方式替换代码,它也会起作用。

希望有帮助。

<小时/>

根据问题的澄清进行编辑(需要阅读多行):

根据您的工作,最简单的方法是使用控制字符,例如“传输结束”(ASCII 上的 0x04)。

客户端代码:

System.out.println("writing");
bw.write("Hello");
bw.newLine();
bw.write("World");
bw.newLine();
bw.write(0x04); // EOT control character
bw.newLine(); // This is needed for BufferedReader/Writer - even if we've used a EOT
bw.flush();
System.out.println("wrote");

在下一个推荐中继续...

服务器代码:

while ((line = br.readLine()) != null && !(line.length() > 0 && line.charAt(0) == 0x04)) {
sb.append(line).append(System.lineSeparator());
}

如果您没有使用 ASCII 或 UTF8,请检查您使用的编码以选择正确的控制字符。

关于java - 带套接字的 BufferedReader 和 BufferedWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026723/

25 4 0
文章推荐: java - 两个实体上的 JPA/Hibernate 双向 Set