TCP上传文件

Soket客户端

package cocketdemo1;

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

public class ClientDemo {
    //客户端 将本地文件上传到服务器,接受服务器的反馈
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("192.168.1.104",10000);
        //是本地的流用来读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\MyTCP\\pictore\\one.jpg"));

        //写到服务器的流-----网络中的流必须get流
        OutputStream socketOutputStream = socket.getOutputStream();//输出流
        BufferedOutputStream bos = new BufferedOutputStream(socketOutputStream);//字节缓冲流包装一下提高效率

        int b;
        while ((b= bis.read())!=-1){
            bos.write(b);//通过网络写入到服务器中
        }
        //给服务器一个结束标记,告诉服务器文件已经传输完毕
        socket.shutdownOutput();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line = br.readLine())!=null){
            System.out.println(line);
        }
        bis.close();
        socket.close();





    }
}

SeverSocket服务器端

package cocketdemo1;

import com.sun.source.tree.Scope;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ServerDemo {
    //服务器:接受客户端上传的文件,上传完毕之后给出反馈
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(10000);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,//核心线程数量
                10,//线程池的总数量
                60,//临时线程空闲时间
                TimeUnit.SECONDS, //临时线程空闲时间的单位
                new ArrayBlockingQueue<>(5),//阻塞队列
                Executors.defaultThreadFactory(),//创建线程的方式
                new ThreadPoolExecutor.AbortPolicy()//任务拒绝策略
        );
        while (true) {
            Socket accept = serverSocket.accept();
           ThreadSocket ts = new ThreadSocket(accept);
         //  new Thread(ts).start();
            pool.submit(ts);
        }
       // serverSocket.close();



    }
}

线程池:

package cocketdemo1;

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

public class ThreadSocket implements Runnable{
    private  Socket acceptSocket;
    public ThreadSocket(Socket accept) {
        this.acceptSocket = accept;
    }

    @Override
    public void run() {
        BufferedOutputStream bufferedOutputStream = null;
        try {
            //网络中的流 ,从客户端读取数据的
            BufferedInputStream bufferedInputStream = new BufferedInputStream(acceptSocket.getInputStream());
            //本地的IO流,把数据写道本地中,实现永久化存储
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(
                    "D:\\MyTCP\\pictore" + UUID.randomUUID().toString() + "jpg"));
            int b;
            while ((b = bufferedInputStream.read()) != -1) {
                bufferedOutputStream.write(b);
            }
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(acceptSocket.getOutputStream()));
            bw.write("上传成功!");
            bw.newLine();//回车换行
            bw.flush();//刷新流

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream !=null){
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (acceptSocket !=null){
                try {
                    acceptSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

要先运行服务器端,再运行客户端。


版权声明:本文为weixin_51014035原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。