1. 客户端:
1 package cn.itcast_12; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileReader; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.Socket; 10 11 /* 12 * 按照我们正常的思路加入反馈信息,结果却没反应。为什么呢? 13 * 读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。 14 * 所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了。 15 * 16 * 如何解决呢? 17 * A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。 18 * 这样做可以解决问题,但是不好。 19 * B:Socket对象提供了一种解决方案 20 * public void shutdownOutput() 21 */ 22 23 public class UploadClient { 24 public static void main(String[] args) throws IOException { 25 // 创建客户端Socket对象 26 Socket s = new Socket("192.168.12.92", 11111); 27 28 // 封装文本文件 29 BufferedReader br = new BufferedReader(new FileReader( 30 "InetAddressDemo.java")); 31 // 封装通道内流 32 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 33 s.getOutputStream())); 34 35 String line = null; 36 while ((line = br.readLine()) != null) { // 阻塞 37 bw.write(line); 38 bw.newLine(); 39 bw.flush(); 40 } 41 42 //自定义一个结束标记 43 // bw.write("over"); 44 // bw.newLine(); 45 // bw.flush(); 46 47 //Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了 48 s.shutdownOutput(); 49 50 // 接收反馈 51 BufferedReader brClient = new BufferedReader(new InputStreamReader( 52 s.getInputStream())); 53 String client = brClient.readLine(); // 阻塞 54 System.out.println(client); 55 56 // 释放资源 57 br.close(); 58 s.close(); 59 } 60 }
(2)服务端:
1 package cn.itcast_12; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12 public class UploadServer { 13 public static void main(String[] args) throws IOException { 14 // 创建服务器端的Socket对象 15 ServerSocket ss = new ServerSocket(11111); 16 17 // 监听客户端连接 18 Socket s = ss.accept();// 阻塞 19 20 // 封装通道内的流 21 BufferedReader br = new BufferedReader(new InputStreamReader( 22 s.getInputStream())); 23 // 封装文本文件 24 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); 25 26 String line = null; 27 while ((line = br.readLine()) != null) { // 阻塞 28 // if("over".equals(line)){ 29 // break; 30 // } 31 bw.write(line); 32 bw.newLine(); 33 bw.flush(); 34 } 35 36 // 给出反馈 37 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter( 38 s.getOutputStream())); 39 bwServer.write("文件上传成功"); 40 bwServer.newLine(); 41 bwServer.flush(); 42 43 // 释放资源 44 bw.close(); 45 s.close(); 46 } 47 }
Java基础知识强化之网络编程笔记12:TCP之TCP协议上传文本文件并给出反馈
原文:http://www.cnblogs.com/hebao0514/p/4872583.html