天才。
我想在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();
双方在打印“阅读”后停止。
我的代码出了什么问题?
提前感谢您的帮助!
答案 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,请检查您使用的编码以选择正确的控制字符。