public class Main {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("server is already");
Socket sockt = serverSocket.accept();
InputStream inputStream = sockt.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String str ;
while((str = bufferedReader.readLine())!= null){
System.out.println(str);
}
// str = bufferedReader.readLine();
// System.out.println(str);
}
}
public class SocketClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 8080);
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello,server");
bufferedWriter.newLine();
bufferedWriter.flush();
}
}
今天写代码的时候,发现了一个Readline()的阻塞问题
大致情况是这样的,在客户端用字节流进行输入,并在服务端用while循环+Readline()进行读取,这个时候会出现阻塞的问题,但是如果把while循环取消,就能够运行。
具体的原因,我分析是因为,如果只是简单的Readline(),他在识别到换行符的时候,就认为这一行结束了,他只读一行,于是他认为读取结束,就可以把内容进行输出。
如果我们加了一个while循环,就会让服务端不明白,你到底什么时候是你输入的结束,就像一个无线长的文本,一行一行的读,虽然一直是空白,但是没有结束标志,服务端会很困扰。
解决办法也很简单,我们在客户端加上这么一句
socket.shutdownOutput();
告诉服务端,我结束了,我的文本有结尾了,你用while循环读到我的结束符就可以结束了。
大概是这么个理解,大佬有觉得什么不对的地方,欢迎批评指正