客户端
public class customer{
static Socket server;
public static void main(String[] args)throws Exception{
server=new Socket(InetAddress.getLocalHost(),5678);
BufferedReader in=new BufferedReader(
new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end")){
break;
}
System.out.println(in.readLine());
}
server.close();
}
}
服务器端:public class server {

 public static void main(String[] args) throws IOException{
          ServerSocket server=new ServerSocket(5678);
           Socket client=server.accept();
           BufferedReader in=new BufferedReader(
            new InputStreamReader(client.getInputStream()));
           PrintWriter out=new PrintWriter(client.getOutputStream());
           BufferedReader wt=new BufferedReader(
            new InputStreamReader(System.in));
           BufferedWriter bw=new BufferedWriter(
            new OutputStreamWriter(client.getOutputStream()));
        while(true){
                String str=in.readLine();
                System.out.println(str);
                str=wt.readLine();
               out.println(str);
                out.write(str);
                bw.write(str);
                out.flush();
                bw.flush();
                if(str.equals("end"))break;
                }
       client.close();
       }
 }
问题在服务器端 为什么用printWriter 的println 方法就没问题 用BufferedWriter的write方法就不行 还有printWriter 的write方法也不行呢 实在想不通啊
高手帮帮忙啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    知道自己错误在哪了 一个主要的因素是PrintWrite方法在调用 println、printf 或 format 的其中一个方法时会自动刷新,且这些方法使用平台自有的行分隔符。也就是说 用println方法时  遇到换行符 就将数据写入输出流中 此时客户端才可接受到数据 并显示出来 而用write方法 和bufferedwriter时 数据不断读取 却没有刷新 因此引起了错误  如果改成有一个中止标记
    例如
    str=wt.readLine();
    while(!str.equals("end")){
                  
                    out.write(str);
                    str=wt.readLine();}
    out.flush();
    这样就没问题了
    郁闷哦 弄了我困惑了好久~~
      

  2.   

    如果改成调用close方法 也可以运行
     调用flush是刷新缓冲区,他会将数据写入到stream中,而调用close是关闭缓冲区,他同样也将数据写入到stream中,但是如果用flush的话,程序会一直在那儿等待着你的输入,他会把数据都放在缓冲区里面一直等到你关闭这个缓冲区的时候他才把数据送走,所以用flush的时候一直都没有结果输出到屏幕上
    而println方法似乎实现机制是把当前行的立刻在平台上输出 
    socket的输入输出流是在同一管道上进行的 在调用flush清空缓冲流后 释放输出流 然后转换为输入流???
    还是模模糊糊啊 。
      

  3.   

    www.ithuzhu.com提问,这里有专职老师为你解答,不管问题多菜,都会耐心解答!