【问题标题】:BufferedReader and BufferedWriter with Socket带 Socket 的 BufferedReader 和 BufferedWriter
【发布时间】:2017-03-26 08:38:25
【问题描述】:

天才。

我想在 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();

打印“阅读”后双方都停止。

我的代码有什么问题?

提前感谢您的帮助!

【问题讨论】:

    标签: java sockets bufferedreader bufferedwriter


    【解决方案1】:

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

    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。所以它会做你所期望的。但是,如果您按照我在服务器端的建议替换代码,它也可以工作。

    希望对你有帮助。


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

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

    客户端代码:

    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,请检查您使用的编码以选择正确的控制字符。

    【讨论】:

    • 如果我需要获取线路怎么办?斯坦福解析器可以解析文档,行列表。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2014-01-07
    • 2015-11-17
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多