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 }