我写了个socket的例子,为什么 用BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 这样写socket通讯好像不通,而我用 注释里的那种写法 :PrintWriter out = new PrintWriter(client.getOutputStream()); 这样客户端发包,服务端收得到信息,而且能返回应答包,为什么会这样??【code=Java】
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5678);
Socket client = server.accept();
BufferedReader bufReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
//PrintWriter out = new PrintWriter(client.getOutputStream());
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
while (true) {
String str = bufReader.readLine();
System.out.println(str);
//out.println("has receive....");
out.write("has receive....");
out.flush();
if (str.equals("end"))
break;
}
client.close();
}
}
public class Client {
static Socket server; public static void main(String[] args) throws Exception {
server = new Socket("192.168.10.40", 5678);
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
// PrintWriter out = new PrintWriter(server.getOutputStream()); 
 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(server.getOutputStream())); 
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); while (true) {
String str = wt.readLine();
out.write(str);
// out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
System.out.println(in.readLine());
}
server.close();
}
}【/code】

解决方案 »

  1.   

         流应该成对(读和写)使用:
          这边以什么格式写进去,那边就应该以什么格式读出来
         BufferedReader <-->PrintStream
         BufferedReader <-->BufferedWriter
          
          对不?
      

  2.   

    呵呵,神秘,实际上理解了原理就没什么神秘的了:String str = wt.readLine();
    out.write(str); 
    out.write("\n");加上红色的这一句,凡是使用BufferedReader.readLine(),而对方使用readLine收的,都要加这一句。为什么,因为readLine读取一行,但丢掉了换行符,
    所以,client发出去的数据,永远都在一行上,没有换行,readLine则一致等在那里不返回。
      

  3.   

    而且我用PrintWriter 是可以的
      

  4.   

    我发现客户端去掉 System.out.println(in.readLine());  这句话 服务端 收包正常,为什么会这样
      

  5.   

    晕。in.readLine 是在等待你输入啊