TCP协议应用--上传文件

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

    /* 需求:客户端输入文本文件,服务器输出文本文件
     * 要求给出反馈信息
     * 按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?
     * 重要的一点,客户端写一行,服务器读一行,所以客户端停止写,客户端也就停止读了。
     * 读取文本文件是可以以null作为结束信息的,但是呢,
     * 通道内是不能这样结束信息的。
     * 所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了。
     * 
     * 如何解决呢?
     * A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。
     *      这样做可以解决问题,但是不好。
     * B:Socket对象提供了一种解决方案
     *      public void shutdownOutput()
     * 
     */
//客户端
    public class ClientDemo {
        public static void main(String[] args) throws IOException{
            //建立客户端socket服务
            Socket s = new Socket("117.64.225.33",33333);
            //封装通道里的写入流
            BufferedWriter bufw = new BufferedWriter
                    (new OutputStreamWriter(s.getOutputStream()));
            //封装要写入的数据
            BufferedReader bufr = new BufferedReader
                    (new FileReader(new File("c:\6.txt")));
            //往通道里写数据
            String line = null;
            while((line = bufr.readLine())!= null){//阻塞式方法
                bufw.write(line);
                bufw.newLine();
                bufw.flush();
            }
    //      //A:自定义一个结束信息
            //这样做不好要是文件中有over这样的字段
            //服务器将读不到后面的数据
    //      bufw.write("over");
    //      bufw.newLine();
    //      bufw.flush();

        //Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
        s.shutdownOutput();
        //接受反馈
        BufferedReader brClient = new BufferedReader
                (new InputStreamReader(s.getInputStream()));
         String info = brClient.readLine();
         System.out.println(info);
        //释放资源
        s.close();
        bufr.close();
    }
}

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//客户端输入文本文件,服务器输出文本文件
//服务器端
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器端socket对象
        ServerSocket ss = new ServerSocket(33333);
        //监听客户端连接
        Socket s = ss.accept();
        //封装通道里的读取流
        BufferedReader bufr = new BufferedReader
                (new InputStreamReader(s.getInputStream()));
        //封装一个写入流,将读取到的数据是写入到指定的文件中
        BufferedWriter bufw = new BufferedWriter
                (new FileWriter(new File("D:\行不行.txt")));
        String line = null;
        while((line = bufr.readLine())!=null){
//          A:if("over".equals(line)){
//              break;
//          }
            bufw.write(line);
            bufw.newLine();
            bufw.flush();
        }
        //
        //反馈
        BufferedWriter bwServer = new BufferedWriter
                (new OutputStreamWriter(s.getOutputStream()));
        bwServer.write("上传文件成功!");
        bwServer.newLine();
        bwServer.flush();
        //释放资源
        s.close();
        bufw.close();
    }
}
很多事情即将开始,很多人的命运即将改变
原文地址:https://www.cnblogs.com/liuzk/p/12458971.html