tcp文件上传优化
1.client
1 public static void main(String[] args) throws IOException { 2 // 创建服务器端的Socket对象 3 ServerSocket ss = new ServerSocket(11111); 4 5 // 监听客户端连接 6 Socket s = ss.accept();// 阻塞 7 8 // 封装通道内的流 9 BufferedReader br = new BufferedReader(new InputStreamReader( 10 s.getInputStream())); 11 // 封装文本文件 12 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); 13 14 String line = null; 15 while ((line = br.readLine()) != null) { // 阻塞 16 // if("over".equals(line)){ 17 // break; 18 // } 19 bw.write(line); 20 bw.newLine(); 21 bw.flush(); 22 } 23 24 // 给出反馈 25 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter( 26 s.getOutputStream())); 27 bwServer.write("文件上传成功"); 28 bwServer.newLine(); 29 bwServer.flush(); 30 31 // 释放资源 32 bw.close(); 33 s.close(); 34 }
2.server
按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?
读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。
所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了
如何解决呢?
A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。
这样做可以解决问题,但是不好。
B:Socket对象提供了一种解决方案
public void shutdownOutput()
1 public static void main(String[] args) throws IOException { 2 // 创建客户端Socket对象 3 Socket s = new Socket("192.168.12.92", 11111); 4 5 // 封装文本文件 6 BufferedReader br = new BufferedReader(new FileReader( 7 "InetAddressDemo.java")); 8 // 封装通道内流 9 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 10 s.getOutputStream())); 11 12 String line = null; 13 while ((line = br.readLine()) != null) { // 阻塞 14 bw.write(line); 15 bw.newLine(); 16 bw.flush(); 17 } 18 19 //自定义一个结束标记 20 // bw.write("over"); 21 // bw.newLine(); 22 // bw.flush(); 23 24 //Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了 25 s.shutdownOutput(); 26 27 // 接收反馈 28 BufferedReader brClient = new BufferedReader(new InputStreamReader( 29 s.getInputStream())); 30 String client = brClient.readLine(); // 阻塞 31 System.out.println(client); 32 33 // 释放资源 34 br.close(); 35 s.close(); 36 }