黑马程序员技术交流社区
标题:
Socket编程关于客户端和服务端阻塞的问题
[打印本页]
作者:
舒远
时间:
2012-9-11 16:05
标题:
Socket编程关于客户端和服务端阻塞的问题
本帖最后由 舒远 于 2012-9-11 19:53 编辑
public class SocketClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 11000);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader readerIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.equals("over"))
break;
writer.println(line);
//writer.flush();//如果这里被注释掉则无法收到服务端返回的消息
String line1 = readerIn.readLine();
System.out.println(line1);
}
reader.close();
writer.close();
socket.close();
}
}
public class SocketServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(11000);
while (true) {
Socket socket = serverSocket.accept();
PrintWriter writer = new PrintWriter(socket.getOutputStream());
BufferedReader readerIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = readerIn.readLine()) != null) {
System.out.println(line);
writer.println("你好,我已收到!");
//writer.flush();//如果这里注释掉则无法收到客户端的消息,而且一直处于阻塞状态
}
readerIn.close();
writer.close();
socket.close();
}
}
}
复制代码
我使用的就是PrintWriter 对象来输出消息的,为什么还要用flush来刷新缓存才能读到数据?
作者:
牛杨
时间:
2012-9-11 16:17
这是因为,
PrintWriter这个流内部有字符数组缓冲区writeBuffer
(这个缓冲区位于PrintWrite类的父类Write内部)。
当你调用这个流对象的write写入方法的时候,其实是把数据先写到了这个缓冲区里面了。如果你不刷新那就不会把数据写到你构造PrintWrite对象的那个底层流中的
在楼主的例子中就是 PrintWriter writer = new PrintWriter(socket.getOutputStream());
里面的socket.getOutputStream() 。
希望对楼主有帮助
作者:
张 涛
时间:
2012-9-11 17:05
因为write方法和print方法只相当于把数据装入管道,flush相当于把管道数据倒入文件。所以必须在write或print之后,刷新。
作者:
刘国强
时间:
2012-9-11 18:45
void println() 通过写入行分隔符字符串终止当前行。 PrintWrite与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
作者:
舒远
时间:
2012-9-11 19:52
PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);//使用这种方式创建打印输出流就能自动flush流了。
谢谢各位。!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2