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 }