实现步骤

  • 创建客户端对象,创建输入流对象指向文件,每读入一行数据就给服务器输出一行数据,输出结束后使用shutdownOutput()方法告知服务端传输结束

  • 创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息。

  • 创建服务端对象,每监听到一个客户端则开启一个新的线程接受数据。

  • 客户端接受服务端的回馈信息

客户端

package TCPDemo;

import java.io.*;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客端Socket对象
        Socket sc =new Socket("192.168.1.210",10086);
        //封装数据包,创建缓冲字符输入流对象,用来封装文本文件
        BufferedReader bufferedReader = new BufferedReader(new FileReader("UDPandTCPdemo\\ReceiveDemo.java"));
        //创建字符缓冲输出流,将数据封装到流中并写入数据
        BufferedWriter bf =new BufferedWriter(new OutputStreamWriter(sc.getOutputStream()));
        //创建字符串对象,写入数据
        String line;
        //while循环,读取字符缓冲输入流对象
        while ((line = bufferedReader.readLine())!=null){
            //写入到字符缓冲输出流对象中
            bf.write(line);
            bf.newLine();
            bf.flush();
        }
        //禁用此套接字的输出流
        sc.shutdownOutput();
        //接受反馈
        BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(sc.getInputStream()));
        //等待读取数据
        String data = bufferedReader1.readLine();
        //返回结果
        System.out.println("服务器反馈 "+data);
        //释放资源
        bufferedReader1.close();
        sc.close();
    }
}

服务端

package TCPDemo;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo01 {
    public static void main(String[] args) throws IOException {
        //创建服务段对象
        ServerSocket serverSocket = new ServerSocket(10086);
        //死循环保持服务端一直开启
        while (true) {
            //监听客户端连接,返回一个对应Socket对象
            Socket socket = serverSocket.accept();
            //为每一个客户端开启一个线程
            new Thread(new ServerThread(socket)).start();

        }
    }

}

线程类

package TCPDemo;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread implements Runnable {
    private Socket s;

    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        //抛出异常
        try {
            //接收数据写入到文本文档
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
            //解决重名问题,定义一个变量
            int count = 0;
            //创建新文档
            File file = new File("UDPandTCPdemo\\ccc(" + count + ").java");
            //循环判断
            while (file.exists()) {
                //如果重名,变量加加
                count++;
                //写入新的文档中
                file = new File("UDPandTCPdemo\\ccc(" + count + ").java");
            }
            //服务器反馈
            BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件上传成功");
            bwServer.newLine();
            bwServer.flush();

            //释放资源
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}