网络编程-TCP程序实例(文本大写转化器)

  1 package netTest;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.InputStreamReader;
  8 import java.io.OutputStream;
  9 import java.io.OutputStreamWriter;
 10 import java.net.InetAddress;
 11 import java.net.Socket;
 12 import java.net.UnknownHostException;
 13 
 14 /*
 15  * 需求:建立一个文本转换服务器
 16  * 客户端给服务器发送文本,服务器会将文本转换成大写再返回给客户端
 17  * 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
 18  *
 19  *步骤: 1.建立服务
 20  *     2.获取键盘录入
 21  *    3.将数据发送给服务端
 22  *    4.获取服务器端返回的大写数据
 23  *    5.结束,关闭资源
 24  *    都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲
 25  */
 26 public class TcpClient {
 27     public static void main(String[] args) throws Exception {
 28         Socket s = new Socket(InetAddress.getLocalHost(),7605);
 29         //OutputStream out = s.getOutputStream();
 30         // 定义一个socket 读取流,读取服务器端返回的大写信息
 31         BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
 32         
 33         // 定义读取键盘数据的流对象
 34         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
 35         
 36         //定义目的,将数据写入到socket输出流,发送给服务器。
 37         BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 38         String line = null;
 39         while((line = bufr.readLine())!=null){
 40             if("over".equals(line)){
 41                 break;
 42             }
 43             bufOut.write(line);
 44             bufOut.newLine();
 45             // 数据在缓冲区中没有出去
 46             bufOut.flush();
 47             //刷新后数据就出去了。
 48             String str = bufIn.readLine();
 49             System.out.println("server:"+str);
 50         }
 51         /*byte[] buf = new byte[1024];
 52         while(true){
 53             int len = bufr.read(buf);
 54             System.out.println(new String(buf,0,len));
 55         }*/
 56         
 57     }
 58 }
 59 /*
 60  * 该例子出现的问题:
 61  * 现象:客户端和服务器端都在莫名的等待。
 62  * 为什么呢? 因为客户端和服务器端都有阻塞式的方法,这些方法没有读到结束标记,那就一直等待下去,从而导致两端
 63  * 都在等待。在 read里面。
 64  */
 65 
 66 
 67 
 68 package netTest;
 69 
 70 import java.io.BufferedReader;
 71 import java.io.BufferedWriter;
 72 import java.io.IOException;
 73 import java.io.InputStream;
 74 import java.io.InputStreamReader;
 75 import java.io.OutputStream;
 76 import java.io.OutputStreamWriter;
 77 import java.net.ServerSocket;
 78 import java.net.Socket;
 79 
 80 /*
 81  * 
 82  * 服务端:源 socket 读取流
 83  *     :目的:socket 输出流
 84  *     文本装饰。
 85  */
 86 public class TcpServer {
 87     public static void main(String[] args) throws IOException {
 88         ServerSocket ss = new ServerSocket(7605);
 89         while(true){
 90             Socket s = ss.accept();
 91             String ip = s.getInetAddress().getHostAddress();
 92             System.out.println(ip);
 93             // 定义一个socket 读取流,读取服务器端返回的大写信息
 94             BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
 95             //定义目的,将数据写入到socket输出流,发送给服务器。
 96             BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 97             String line = null;
 98             // 在读一行时实际上读到是回车前的数据,这是没有一行
 99             while((line = bufIn.readLine())!=null){
100                 System.out.println(line);
101                 if(line.equals("over")){
102                     break;
103                 }
104                 bufOut.write(line.toUpperCase());
105                 // 这是结束标记这个地方很重要  。。。。。。。。。
106                 bufOut.newLine();
107                 bufOut.flush();
108             }
109             s.close();
110             ss.close();
111         }
112         
113     }
114 }

 

posted @ 2016-01-19 21:15  HuberyQian  阅读(448)  评论(0编辑  收藏  举报