带有Socket的BufferedReader和BufferedWriter

时间:2017-03-26 08:38:26

标签: java sockets bufferedreader bufferedwriter

天才。

我想在Java中使用socket。

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

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();

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

我的代码出了什么问题?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分: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。所以它会做你期望的。但是,如果你正在替换我为服务器端建议的代码,它也会有效。

希望它有所帮助。

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

基于您工作的最简单方法是使用控制字符,例如“传输结束”(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,请检查您使用的编码以选择正确的控制字符。