黑马程序员之TCP

时间:2022-12-08 21:25:13

------- android培训java培训、期待与您交流! ---------- 

下面是关于TCP的一个例子:有些注意点

如果觉得太乱的话,可以直接copy到eclipse中执行会更容易理解呦^^

/**
 * 要求:建立一个文本转换服务器
 * 客户端给服务器发送文本,服务端会将文本转换大写返回客户端
 * 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束
 *
 * 分析:
 * 客户端:
 * 既然是操作设备上的数据,那么就会使用io技术,并按照io的操作规律来思考。
 * 源:键盘录入
 * 目的:网络设备,网络输出流
 * 而且操作的是文本数据,可以选择字符流
 *
 * 步骤:
 * 1,建立服务
 * 2,获取键盘录入
 * 3,将数据发给服务器
 * 4,获取服务端返回的大写数据
 * 5,结束,关资源
 *
 * 注意:readLine方法读取一行,是阻塞式方法,读到换行符才会停止
 * 如果没有接收到客户端的换行符,
 * 服务端会认为还没有结束,会一直等待
 * 同理,服务器端反馈回的数据也要有换行符,客户端输入流读到换行符才会结束
 */

//客户端
class TransTextClient{
 public static void main(String[] args) throws Exception{

//1,建立Sockcet服务,指定连接主机和端口
  Socket s = new Socket("localhost",10001);
  //2,定义读取键盘数据的流对象
  BufferedReader br =
   new BufferedReader(new InputStreamReader(System.in));
  /3,获取Socket流中的输出流。将数据写到流中,通过网络发送给服务端
//  BufferedWriter bw =
//   new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  //上面的这句获取输出流的代码可以用下面这句PrintWriter代替,后面的true代表可以使用println、printfformat 方法将刷新输出缓冲区
  PrintWriter pr = new PrintWriter(s.getOutputStream(),true);
  //4,定义一个socket读取流,读取服务器端返回的大写信息
  BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));
  String line = null;
  while((line = br.readLine())!= null ){
   if("over".equals(line)){
    break;
   }

//PrintWriter的方法可以将刷新输出缓冲区,所以使用这个方法,可以省略flush方法
   pr.println(line);
//   bw.write(line);
//   //写入一个行分隔符,服务端读到行分隔符,才能判断出客户端输入结束,如果不写这句的话,服务端会一直等待
//   bw.newLine();

//   //使用缓冲流要记得flush
//  bw.flush();
   String str = bufin.readLine();
   System.out.println("服务端说:"+str);
  }

//5,结束,关资源
  br.close();
  s.close();
  
 }

}
/**
 * 服务端:
 * 源:socket读取流
 * 目的:socket输出流
 *
 */

class TransTextServer{
 public static void main(String[] args) throws Exception{

//1,建立Sockcet服务,指定连接端口
  ServerSocket ss = new ServerSocket(10001);
//2,获取客户端的Socket对象  
  Socket s = ss.accept();
  //3,读取socket读取流中的数据
  BufferedReader br =
   new BufferedReader(new InputStreamReader(s.getInputStream()));
  
  //4,目的:获取socket输出流中的输出流,将大写数据写入到socket输出流,并发送给客户端
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

  String line =null ;
  while((line=br.readLine())!=null){
   System.out.println("客户端说:"+line);
   bw.write(line.toUpperCase());
   bw.newLine();//写入一个行分隔符
   bw.flush();
  }

//5,关闭资源
  s.close();
  ss.close();
 }
}