这个程序的功能是server 端和client端对话
os.flush();这句加了 Server端的程序就能收到Client发过来的消息,
没加 os.flush();这句 Server端的程序就不能收到Client发过来的消息,
client端
import java.io.*;
import java.net.*;
public class talkclient
{
public static void main(String args[])
{
try
{
Socket socket = new Socket("127.0.0.1",4700);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String readline;
readline = sin.readLine();
while (!readline.equals("bye"))
{
os.println(readline);
os.flush(); //问题在这,为什么不加这句就运行不正常 这个不懂
System.out.println("Client:" + readline);
System.out.println("Server:" + is.readLine());
readline = sin.readLine();
}
os.close();
is.close();
socket.close();
}catch(Exception e)
{
System.out.println("Error" + e);
}
}
}
Server端
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class talkserver
{
public static void main(String args[])
{
try
{
ServerSocket server = null;
try
{
server = new ServerSocket(4700);
}catch(Exception e)
{
System.out.println("can not listen to:" + e);
}
Socket socket = null;
try
{
socket = server.accept();
}catch(Exception e)
{
System.out.println("Error:" + e);
}
String line;
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:" + is.readLine());
line = sin.readLine();
while (!line.equals("bye"))
{
os.println(line);
os.flush();
System.out.println("Server:" + line);
System.out.println("Client:" + is.readLine());
line = sin.readLine();
}
is.close();
os.close();
socket.close();
server.close();
}catch(Exception e)
{
System.out.println("Error" + e);
}
}
}
------解决方案--------------------
发代码用代码框,在表情左边。
注意直接从你的编辑器中复制过来,不要拿上面缩进已经没了的代码复制,代码框只能保持缩进和进行语法高亮,没有自动缩进那么高级。
------解决方案--------------------
flush方法是强制刷新缓冲区。
何谓缓冲区呢,就是在你本机器上创建一个空间,这个空间可以让你先放些东西进去,比如你os.println进去的内容,如果你不调用flush,那么println进去的内容就只是留在缓冲区中,而不是进入网络传输通道传输到客户端。
说得有些杂了,举个例子恶心的例子:马桶就是你上面的client端,便池就是你上面的Server端,os.println就是你拉了屎,但你拉屎是拉在马桶的桶身中,如果你不冲一下水(flush方法),那屎就永远停留在桶身中,而不会自动流到便池。
------解决方案--------------------
flush本意是冲刷,这个方法大概取自它引申义冲马桶的意思,马桶有个池子,你往里面扔东西,会暂时保存在池子里,只有你放水冲下去,东西才会进入下水道。
同理很多流都有一个这样的池子,专业术语叫缓冲区,当你print或者write的时候,会暂时保存在缓冲区,并没有发送出去,这是出于效率考虑的,因为数据不会自己发送过去,必须有其他机制,而且这个很消耗资源,就像马桶你需要很多水,才能冲走,你如果扔一点东西,就冲一次水,那你水费要爆表了,同样如果你写一行文字,或者一个字节,就要马上发送出去,那网络流量,CPU使用率等等都要爆表了,所以一般只有在你真正需要发送否则无法继续的时候,调用flush,将数据发送出去。
------解决方案--------------------
两位心有灵犀,都用马桶举例子 哈哈
------解决方案--------------------
每个流有自己的缓冲区
------解决方案--------------------
flush方法是强制刷新缓冲区。
何谓缓冲区呢,就是在你本机器上创建一个空间,这个空间可以让你先放些东西进去,比如你os.println进去的内容,如果你不调用flush,那么println进去的内容就只是留在缓冲区中,而不是进入网络传输通道传输到客户端。
说得有些杂了,举个例子恶心的例子:马桶就是你上面的client端,便池就是你上面的Server端,os.println就是你拉了屎,但你拉屎是拉在马桶的桶身中,如果你不冲一下水(flush方法),那屎就永远停留在桶身中,而不会自动流到便池。