我在做TCP通信的练习时用到了bufferedWriter和printWriter两个类,但出现了一个问题:用printWriter写出时,Server那边能收到信息,但BufferedWriter写出时,服务器收不到, 为什么? 代码如下:下面的失败,但是换成注释的代码又可以;请高手指点!!//Client端;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;public class ChatClient {
public static void main(String[] args) {

BufferedWriter bw = null;
//PrintWriter pw = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

try {
Socket s = new Socket("127.0.0.1",6006);
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//pw = new PrintWriter(s.getOutputStream());
String msg = br.readLine();
while(msg != null && msg.trim().length() != 0) {
bw.write(msg);
//pw.println(msg);
bw.flush();
msg = br.readLine();
}
bw.close();
br.close();
}catch(Exception e) {
System.out.println("与服务器断开!");
}
}
}
//Server端;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;class ChatServer {
public static void main(String[] args) 
{
ServerSocket ss = null;

try {
ss = new ServerSocket(6006);
while(true) {
Socket s = ss.accept();
new ChatConn(s);
}

} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
} static class ChatConn implements Runnable {
Socket s = null; 
BufferedReader br = null;
public ChatConn(Socket s) {
this.s = s;
new Thread(this).start();
}
public void run() {
try{
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg = br.readLine();
while(msg != null && msg.trim().length() != 0) {
System.out.println(msg);
msg = br.readLine();
} } catch(Exception e) {
System.out.println("断开通信!");
}
}
}
}

解决方案 »

  1.   

    bufferedWriter需要flush  保证缓冲区中的数据都写入
      

  2.   

    我写了flush();但还是有错,server端接不到数据
      

  3.   

    改一下客户端的代码试试  
    import java.io.BufferedReader; 
    import java.io.BufferedWriter; 
    import java.io.InputStreamReader; 
    import java.io.OutputStreamWriter; 
    import java.net.Socket; public class ChatClient { 
    public static void main(String[] args) { BufferedWriter bw = null; 
    //PrintWriter pw = null; 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { 
    Socket s = new Socket("127.0.0.1",6006); 
    bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
    //pw = new PrintWriter(s.getOutputStream()); 
    String msg = br.readLine(); 
    while(msg != null && !msg.trim().equals("bye")) { 
    bw.write(msg); 
    //pw.println(msg); System.out.println(">>>>>>>>>."+msg);
    bw.newLine();
    msg = br.readLine(); 

    bw.flush(); 
    bw.close(); 
    br.close(); 
    }catch(Exception e) { 
    System.out.println("与服务器断开!"); 


      

  4.   

    因为比PrintWriter.println少了换行符,客户端永远收不到一行结束的标志。
    在flush前加BufferedWriter.newLine就可以了。
      

  5.   

    PrintWriter方法可以写不同平台的换行符,bufferedwriter.newLine换行,使用PrintWriter比较好!