网络编程 TCP服务端优化

在实际中,服务器端很少关闭

package com.llb.tcp.服务器优化;

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

public class Server {
    public static void main(String[] args) throws IOException {
        //循环方式
//        whileMethod();
        //UUID生成新文件名
//        uuidNameMethod();
        //用多线程优化  同时处理多个客户端
        //以上两种,同一时间,只能有一个服务端访问服务器
//        threadMethod();
        //用线程池优化
        threadPoolMethod();
    }
    //循环方式
    private static void whileMethod() throws IOException {
        ServerSocket serverSocket = new ServerSocket(10014);
        while (true) {
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);

            BufferedOutputStream bos =
                    new BufferedOutputStream(
                            new FileOutputStream("Day15\\b.png"));

            int len;
            byte[] bytes = new byte[1024];
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
                bos.flush();
            }
            bos.close();
            //告诉客户端上传完毕
            OutputStream os = socket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            bw.write("上传完毕");
            bw.newLine();
            bw.flush();

            socket.close();
        }
//        serverSocket.close();
    }
    //UUID生成新文件名
    private static void uuidNameMethod() throws IOException {

        ServerSocket serverSocket = new ServerSocket(10014);
        while (true) {
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            String uuid =
                    UUID.randomUUID().toString().replace("-","");
            BufferedOutputStream bos =
                    new BufferedOutputStream(
                            new FileOutputStream("Day15\\"+uuid+".png"));

            int len;
            byte[] bytes = new byte[1024];
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
                bos.flush();
            }
            bos.close();
            //告诉客户端上传完毕
            OutputStream os = socket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            bw.write("上传完毕");
            bw.newLine();
            bw.flush();

            socket.close();
        }
//        serverSocket.close();
    }
    //用多线程优化  同时处理多个客户端
    private static void threadMethod() throws IOException {
        ServerSocket serverSocket = new ServerSocket(10014);
        while (true) {
            //服务器只负责接收客户端的访问,然后把任务交给子线程
            //服务端只负责接收客户端请求,子线程负责处理业务
            Socket socket = serverSocket.accept();
            //通过构造方法传递socket  给ServerThread
            ServerThread st = new ServerThread(socket);
            Thread thread = new Thread(st);
            thread.start();
        }
//        serverSocket.close();
    }
    //用线程池优化
    private static void threadPoolMethod() throws IOException{
        ServerSocket serverSocket = new ServerSocket(10014);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3, //核心线程数量
                10, //最大线程数
                60, //空闲线程最大存活时间
                TimeUnit.SECONDS, //空闲线程最大存活时间的单位
                new ArrayBlockingQueue<Runnable>(5), //任务队列,容量为5
                Executors.defaultThreadFactory(), //创建线程的工厂
                new ThreadPoolExecutor.AbortPolicy() //拒绝策略
        );
        while (true) {
            //服务器只负责接收客户端的访问,然后把任务交给子线程
            //服务端只负责接收客户端请求,子线程负责处理业务
            Socket socket = serverSocket.accept();
            //通过构造方法传递socket  给ServerThread
            ServerThread st = new ServerThread(socket);
            pool.submit(st);
        }
    }
}



package com.llb.tcp.服务器优化;

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

public class ServerThread implements  Runnable {
    private Socket socket;

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

    public void run() {
        BufferedOutputStream bos = null;
        try {
            InputStream is =
                    socket.getInputStream();
            BufferedInputStream bis =
                    new BufferedInputStream(is);
            String uuid =
                    UUID.randomUUID().toString().replace("-","");
            bos =new BufferedOutputStream(
                    new FileOutputStream("Day15\\"+uuid+".png"));
            int len;
            byte[] bytes =
                    new byte[1024];
            while ((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
                bos.flush();
            }

            //告诉客户端上传完毕
            OutputStream os =
                    socket.getOutputStream();
            BufferedWriter bw =
                    new BufferedWriter(new OutputStreamWriter(os));
            bw.write("上传完毕");
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos!=null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}



package com.llb.tcp.服务器优化;

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10014);
        //要上传的文件
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("Day15\\a.png")
        );
        //
        OutputStream os = socket.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(os);
        int len;
        byte[] bytes = new byte[1024];
        while ((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
            bos.flush();
        }
        bis.close();
        //告诉服务器上传完毕
        socket.shutdownOutput();
        //获取服务器端上传结果
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String s = br.readLine();
        System.out.println(s);
        socket.close();

    }
}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值