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 }