黑马程序员技术交流社区

标题: 网络编程中的IO问题! 请各位大虾指教一下 [打印本页]

作者: 创出一片辉煌    时间: 2012-8-23 23:33
标题: 网络编程中的IO问题! 请各位大虾指教一下
import java.net.* ;
import java.io.* ;
import java.util.*;
public class EchoClient{
public static void main(String args[]) throws Exception { // 所有异常抛出
  Socket client = new Socket("localhost",8888) ;// 表示客 户端
   Scanner sc=new Scanner(System.in);
  BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ; // 一次性接收完成
  BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())) ;//发送
  //PrintStream out  = new PrintStream(client.getOutputStream()) ;
  System.out.print("输入信息:") ;
  String str =sc.nextLine() ; // 接收键盘的输入信息
   out.write(str) ;
  //out.println(str+"\r\n");  readLine读取是是按回车换行符结束的!我加上回车换行可还是不行???????
  String echo = buf.readLine() ; // 接收返回结果
  System.out.println(echo) ; // 输出回应信息
  buf.close() ;
  client.close() ;
}
};
------------------------------------------------------------
import java.net.* ;
import java.io.* ;
public class EchoServer{
public static void main(String args[]) throws Exception { // 所有异常抛出
  ServerSocket server = new ServerSocket(8888) ; // 服务器在8888端口上监听,定义ServerSocket类
  System.out.println("服务器运行,等待客户端连接。") ;
  Socket client = server.accept() ;  // 得到连接,程序进入到阻塞状态
  // 准备接收客户端的输入信息
  BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
  PrintStream out = new PrintStream(client.getOutputStream()) ;
//BufferedWriter out=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())) ;//发送
   
   String str = buf.readLine() ;  // 接收客户端发送的内容
   System.out.println(str);
   out.println("ECHO : " + str) ; // 回应信息
   //out.write("ECHO : " + str);
   client.close() ;
  server.close() ;
}
};
-----------------------------------------------------------------------------
我是准备写一个客户端输出信息,通过服务端把客户端发的信息在返回去,并加上“ECHO:”
可是我用BufferedWriter 这个类把内容就是传不过去,一直停留在输入状态!我认为是服务器端还不知道信息结束,可是readLine是看到回车符就把这条信息读取,用PrintStream 可以,为什么用BufferedWriter 及不可以呢??
用这两个类进行数据的发送有区别吗??我看PrintStream 的源码println方法是这样的: public void println(String x) {
synchronized (this) {
     print(x);
     newLine();
}
    }
它同样是用BufferedWriter类的write方法进行输入,并加一个换行符啊??为什么我用BufferedWriter却不行呢?我也加换行符啦?

作者: 黑马_许芸    时间: 2012-8-24 08:11
因为BufferedWriter会将所有的输入全部写入暖冲区中。当写满缓冲区或关闭输出流时,它再一次性输出到流,或者用flush()方法主动将缓冲区输出到流。

你在 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())) ;//发送
这行代码后面写out.close(); 或者 out.flush(); 应该就可以了。
作者: 童兴龙    时间: 2012-8-24 08:32
2楼正解




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2