• Java之UDP,TCP的详细解析


    练习四:文件名重复

    1. public class UUIDTest { public static void main(String[] args) { String str = UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } ```
    2. public class Client {
    3.    public static void main(String[] args) throws IOException {
    4.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    5.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    6.        //1. 创建Socket对象,并连接服务器
    7.        Socket socket = new Socket("127.0.0.1",10000);
    8.        //2.读取本地文件中的数据,并写到服务器当中
    9.        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
    10.        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    11.        byte[] bytes = new byte[1024];
    12.        int len;
    13.        while ((len = bis.read(bytes)) != -1){
    14.            bos.write(bytes,0,len);
    15.       }
    16.        //往服务器写出结束标记
    17.        socket.shutdownOutput();
    18.        //3.接收服务器的回写数据
    19.        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    20.        String line = br.readLine();
    21.        System.out.println(line);
    22.        //4.释放资源
    23.        socket.close();
    24.   }
    25. }
    26. public class Server {
    27.    public static void main(String[] args) throws IOException {
    28.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    29.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    30.        //1.创建对象并绑定端口
    31.        ServerSocket ss = new ServerSocket(10000);
    32.        //2.等待客户端来连接
    33.        Socket socket = ss.accept();
    34.        //3.读取数据并保存到本地文件中
    35.        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    36.        String name = UUID.randomUUID().toString().replace("-", "");
    37.        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
    38.        int len;
    39.        byte[] bytes = new byte[1024];
    40.        while ((len = bis.read(bytes)) != -1) {
    41.            bos.write(bytes, 0, len);
    42.       }
    43.        bos.close();
    44.        //4.回写数据
    45.        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    46.        bw.write("上传成功");
    47.        bw.newLine();
    48.        bw.flush();
    49.        //5.释放资源
    50.        socket.close();
    51.        ss.close();
    52.   }
    53. }

    练习五:服务器改写为多线程

    服务器只能处理一个客户端请求,接收完一个图片之后,服务器就关闭了。

    优化方案一:

    使用循环

    弊端:

    第一个用户正在上传数据,第二个用户就来访问了,此时第二个用户是无法成功上传的。

    所以,使用多线程改进

    优化方案二:

    每来一个用户,就开启多线程处理

    1. public class Client {
    2.    public static void main(String[] args) throws IOException {
    3.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    4.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    5.        //1. 创建Socket对象,并连接服务器
    6.        Socket socket = new Socket("127.0.0.1",10000);
    7.        //2.读取本地文件中的数据,并写到服务器当中
    8.        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
    9.        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    10.        byte[] bytes = new byte[1024];
    11.        int len;
    12.        while ((len = bis.read(bytes)) != -1){
    13.            bos.write(bytes,0,len);
    14.       }
    15.        //往服务器写出结束标记
    16.        socket.shutdownOutput();
    17.        //3.接收服务器的回写数据
    18.        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    19.        String line = br.readLine();
    20.        System.out.println(line);
    21.        //4.释放资源
    22.        socket.close();
    23.   }
    24. }
    25. public class Server {
    26.    public static void main(String[] args) throws IOException {
    27.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    28.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    29.        //1.创建对象并绑定端口
    30.        ServerSocket ss = new ServerSocket(10000);
    31.        while (true) {
    32.            //2.等待客户端来连接
    33.            Socket socket = ss.accept();
    34.            //开启一条线程
    35.            //一个用户就对应服务端的一条线程
    36.            new Thread(new MyRunnable(socket)).start();
    37.       }
    38.   }
    39. }
    40. public class MyRunnable implements Runnable{
    41.    Socket socket;
    42.    public MyRunnable(Socket socket){
    43.        this.socket = socket;
    44.   }
    45.    @Override
    46.    public void run() {
    47.        try {
    48.            //3.读取数据并保存到本地文件中
    49.            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    50.            String name = UUID.randomUUID().toString().replace("-", "");
    51.            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
    52.            int len;
    53.            byte[] bytes = new byte[1024];
    54.            while ((len = bis.read(bytes)) != -1) {
    55.                bos.write(bytes, 0, len);
    56.           }
    57.            bos.close();
    58.            //4.回写数据
    59.            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    60.            bw.write("上传成功");
    61.            bw.newLine();
    62.            bw.flush();
    63.       } catch (IOException e) {
    64.            e.printStackTrace();
    65.       } finally {
    66.            //5.释放资源
    67.           if(socket != null){
    68.               try {
    69.                   socket.close();
    70.               } catch (IOException e) {
    71.                   e.printStackTrace();
    72.               }
    73.           }
    74.       }
    75.   }
    76. }

    练习六:线程池改进

    1. public class Client {
    2.    public static void main(String[] args) throws IOException {
    3.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    4.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    5.        //1. 创建Socket对象,并连接服务器
    6.        Socket socket = new Socket("127.0.0.1",10000);
    7.        //2.读取本地文件中的数据,并写到服务器当中
    8.        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));
    9.        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    10.        byte[] bytes = new byte[1024];
    11.        int len;
    12.        while ((len = bis.read(bytes)) != -1){
    13.            bos.write(bytes,0,len);
    14.       }
    15.        //往服务器写出结束标记
    16.        socket.shutdownOutput();
    17.        //3.接收服务器的回写数据
    18.        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    19.        String line = br.readLine();
    20.        System.out.println(line);
    21.        //4.释放资源
    22.        socket.close();
    23.   }
    24. }
    25. public class Server {
    26.    public static void main(String[] args) throws IOException {
    27.        //客户端:将本地文件上传到服务器。接收服务器的反馈。
    28.        //服务器:接收客户端上传的文件,上传完毕之后给出反馈。
    29.        //创建线程池对象
    30.        ThreadPoolExecutor pool = new ThreadPoolExecutor(
    31.                3,//核心线程数量
    32.                16,//线程池总大小
    33.                60,//空闲时间
    34.                TimeUnit.SECONDS,//空闲时间(单位)
    35.                new ArrayBlockingQueue<>(2),//队列
    36.                Executors.defaultThreadFactory(),//线程工厂,让线程池如何创建线程对象
    37.                new ThreadPoolExecutor.AbortPolicy()//阻塞队列
    38.       );
    39.        //1.创建对象并绑定端口
    40.        ServerSocket ss = new ServerSocket(10000);
    41.        while (true) {
    42.            //2.等待客户端来连接
    43.            Socket socket = ss.accept();
    44.            //开启一条线程
    45.            //一个用户就对应服务端的一条线程
    46.            //new Thread(new MyRunnable(socket)).start();
    47.            pool.submit(new MyRunnable(socket));
    48.       }
    49.   }
    50. }
    51. public class MyRunnable implements Runnable{
    52.    Socket socket;
    53.    public MyRunnable(Socket socket){
    54.        this.socket = socket;
    55.   }
    56.    @Override
    57.    public void run() {
    58.        try {
    59.            //3.读取数据并保存到本地文件中
    60.            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
    61.            String name = UUID.randomUUID().toString().replace("-", "");
    62.            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
    63.            int len;
    64.            byte[] bytes = new byte[1024];
    65.            while ((len = bis.read(bytes)) != -1) {
    66.                bos.write(bytes, 0, len);
    67.           }
    68.            bos.close();
    69.            //4.回写数据
    70.            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    71.            bw.write("上传成功");
    72.            bw.newLine();
    73.            bw.flush();
    74.       } catch (IOException e) {
    75.            e.printStackTrace();
    76.       } finally {
    77.            //5.释放资源
    78.           if(socket != null){
    79.               try {
    80.                   socket.close();
    81.               } catch (IOException e) {
    82.                   e.printStackTrace();
    83.               }
    84.           }
    85.       }
    86.   }
    87. }
  • 相关阅读:
    【数据结构】测试4 串
    java114-Calendar类方法before
    无人机航测没信号?北斗卫星来解决
    【Linux内核系列】进程调度
    状态机的技术选型看这篇就够了,最后一个直叫好!!!
    webstorm 去除注释空格
    快捷输入法怎么设置
    ICSFUZZ:操纵I/O、二进制代码重用以及插桩,来Fuzzing工业控制应用程序
    Llama2 论文中译版——开放式基础和微调聊天模型
    Linux- 使用ssh远程连接
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/133692095