TCP练习:
1、客户端键盘录入,服务器输出文本文件
客户端代码:
1 public class ClientDemo {
2 public static void main(String[] args) throws IOException {
3
4 // 创建socket对象
5 Socket s = new Socket("172.19.12.233", 10010);
6
7 // 创建键盘输入流,用转换流包装成字符流
8 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9
10 // 把通道中的字节流用转换流包装成字符流
11 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
12 s.getOutputStream()));
13
14 //读取键盘输入的数据,并传输到服务器端
15 String line = null;
16 while((line = br.readLine()) != null){
17 //设定个关闭键盘的命令
18 if(line.equals("esc")){
19 break;
20 }
21 bw.write(line);
22 bw.newLine();
23 bw.flush();
24 }
25 //释放资源
26 s.close();
27
28 }
29 }
服务器代码:
1 public class ServerDemo {
2 public static void main(String[] args) throws IOException {
3
4 // 创建ServerSocket对象,监听
5 ServerSocket ss = new ServerSocket(10010);
6
7 // 创建socket对象
8 Socket s = ss.accept();
9
10 // 把通道中的字节流包装成字符流
11 BufferedReader br = new BufferedReader(new InputStreamReader(
12 s.getInputStream()));
13
14 // 封装文件目录
15 BufferedWriter bw = new BufferedWriter(new FileWriter("TCP.txt"));
16
17 // 把读取到的数据写入到文件中
18 String line = null;
19 while ((line = br.readLine()) != null) {
20 bw.write(line);
21 bw.newLine();
22 bw.flush();
23 }
24
25 // 释放资源
26 s.close();
27 bw.close();
28
29 }
30 }
2、客户端文本文件,服务器输出到控制台
客户端代码:
1 public class ClientDemo {
2
3 public static void main(String[] args) throws IOException, IOException {
4
5 // 创建socket传送对象
6 Socket s = new Socket("172.19.12.233", 10010);
7
8 // 封装文本文件,字符流读取里面的数据
9 BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));
10 // 封装通道里的字节流为字符流
11 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
12 s.getOutputStream()));
13
14 // 把读取到的数据输出到服务器端
15 String line = null;
16 while ((line = br.readLine()) != null) {
17 bw.write(line);
18 bw.newLine();
19 bw.flush();
20 }
21
22 //释放资源
23 s.close();
24 br.close();
25 }
26 }
服务器代码:
1 public class ServerDemo {
2 public static void main(String[] args) throws IOException {
3
4 // 创建ServerSocket对象,监听
5 ServerSocket ss = new ServerSocket(10010);
6
7 // 创建socket对象
8 Socket s = ss.accept();
9
10 // 把通道中的字节流包装成字符流
11 BufferedReader br = new BufferedReader(new InputStreamReader(
12 s.getInputStream()));
13
14 // 接收客户端发来都数据
15 String line = null;
16 while ((line = br.readLine()) != null) {
17 System.out.println(line);
18 }
19
20 //释放资源
21 s.close();
22
23 }
24 }
3、客户端读取文本文件,服务器输出文本文件
(可用来上传文件)
若是上传文件,那么我上传文件完毕后,客户端就要获得一个反馈。
但是,只单单给服务器添加发送反馈,客户端添加接收反馈不行。
因为:
读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。
所以,服务器根本就不知道读取结束了。而如果还想服务器给客户端反馈。所以,两者都在相互等待。
如何解决呢?
A:在多写一条数据,告诉服务器,读取到这条数据说明传输就结束,服务器的接收也结束吧。
这样做可以解决问题,但是不好。因为你这个数据如果文件中刚好就存在,那么就提前结束了。
B:Socket对象提供了一种解决方案
public void shutdownOutput():
禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。
客户端的代码
1 public class ClientDemo {
2 public static void main(String[] args) throws IOException {
3
4 // 创建Socket对象
5 Socket s = new Socket("172.19.12.233", 10010);
6
7 // 封装文件目录
8 BufferedReader br = new BufferedReader(new FileReader(
9 "InetAddressDemo.java"));
10
11 // 把通道内的字节流包装成字符流
12 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
13 s.getOutputStream()));
14
15 // 获取文件中的数据,并输出给服务器
16 String line = null;
17 while ((line = br.readLine()) != null) {
18
19 bw.write(line);
20 bw.newLine();
21 bw.flush();
22 }
23
24 //给服务器一个信号,上面的文本中的数据已经传递完毕
25 s.shutdownOutput();
26
27 // 接收反馈
28 BufferedReader brr = new BufferedReader(new InputStreamReader(
29 s.getInputStream()));
30
31 // 获取反馈,并输出到控制台
32 String line1 = null;
33 while ((line1 = brr.readLine()) != null) {
34 System.out.println(line1);
35 }
36
37 brr.close();
38 s.close();
39 br.close();
40
41 }
42 }
服务器的代码:
1 public class ServerDemo {
2 public static void main(String[] args) throws IOException {
3
4 // 创建ServerSocket对象,监听
5 ServerSocket ss = new ServerSocket(10010);
6
7 // 创建socket对象
8 Socket s = ss.accept();
9
10 // 把通道内的字节流包装成字符流
11 BufferedReader br = new BufferedReader(new InputStreamReader(
12 s.getInputStream()));
13
14 // 封装文件目录
15 BufferedWriter bw = new BufferedWriter(new FileWriter("TCPto.txt"));
16
17 // 获取数据,并输出到文件中
18 String line = null;
19 while ((line = br.readLine()) != null) {
20 bw.write(line);
21 bw.newLine();
22 bw.flush();
23 }
24
25 // 给出反馈
26 BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter(
27 s.getOutputStream()));
28 bwr.write("你的文件上传成功!");
29 bwr.newLine();
30 bwr.flush();
31
32 // 释放资源
33 s.close();
34 bw.close();
35 bwr.close();
36 }
37 }