• Java之TCP,UDP综合小练习一


    4. 综合练习

    练习一:多发多收

    需求:

    客户端:多次发送数据

    服务器:接收多次接收数据,并打印

    代码示例:

    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.        Scanner sc = new Scanner(System.in);
    9.        OutputStream os = socket.getOutputStream();
    10.        while (true) {
    11.            System.out.println("请输入您要发送的信息");
    12.            String str = sc.nextLine();
    13.            if("886".equals(str)){
    14.                break;
    15.           }
    16.            os.write(str.getBytes());
    17.       }
    18.        //3.释放资源
    19.        socket.close();
    20.   }
    21. }
    22. public class Server {
    23.    public static void main(String[] args) throws IOException {
    24.        //客户端:多次发送数据
    25.        //服务器:接收多次接收数据,并打印
    26.        //1.创建对象绑定10000端口
    27.        ServerSocket ss = new ServerSocket(10000);
    28.        //2.等待客户端来连接
    29.        Socket socket = ss.accept();
    30.        //3.读取数据
    31.        InputStreamReader isr = new InputStreamReader(socket.getInputStream());
    32.        int b;
    33.        while ((b = isr.read()) != -1){
    34.            System.out.print((char)b);
    35.       }
    36.        //4.释放资源
    37.        socket.close();
    38.        ss.close();
    39.   }
    40. }

    练习二:接收并反馈

    • 案例需求

      客户端:发送数据,接受服务器反馈

      服务器:收到消息后给出反馈

    • 案例分析

      • 客户端创建对象,使用输出流输出数据

      • 服务端创建对象,使用输入流接受数据

      • 服务端使用输出流给出反馈数据

      • 客户端使用输入流接受反馈数据

    • 代码实现

      1. // 客户端
      2. public class ClientDemo {
      3.    public static void main(String[] args) throws IOException {
      4.        Socket socket = new Socket("127.0.0.1",10000);
      5.        OutputStream os = socket.getOutputStream();
      6.        os.write("hello".getBytes());
      7.       // os.close();如果在这里关流,会导致整个socket都无法使用
      8.        socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何影响
      9.        
      10.        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      11.        String line;
      12.        while((line = br.readLine())!=null){
      13.            System.out.println(line);
      14.       }
      15.        br.close();
      16.        os.close();
      17.        socket.close();
      18.   }
      19. }
      20. // 服务器
      21. public class ServerDemo {
      22.    public static void main(String[] args) throws IOException {
      23.        ServerSocket ss = new ServerSocket(10000);
      24.        Socket accept = ss.accept();
      25.        InputStream is = accept.getInputStream();
      26.        int b;
      27.        while((b = is.read())!=-1){
      28.            System.out.println((char) b);
      29.       }
      30.        System.out.println("看看我执行了吗?");
      31.        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
      32.        bw.write("你谁啊?");
      33.        bw.newLine();
      34.        bw.flush();
      35.        bw.close();
      36.        is.close();
      37.        accept.close();
      38.        ss.close();
      39.   }
      40. }

    练习三:上传练习(TCP协议)

    • 案例需求

      客户端:数据来自于本地文件,接收服务器反馈

      服务器:接收到的数据写入本地文件,给出反馈

    • 案例分析

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

      • 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,传输结束后。使用输出流给客户端反馈信息

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

    • 相关方法

      方法名说明
      void shutdownInput()将此套接字的输入流放置在“流的末尾”
      void shutdownOutput()禁止用此套接字的输出流
    • 代码实现

      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.        //2.等待客户端来连接
      32.        Socket socket = ss.accept();
      33.        //3.读取数据并保存到本地文件中
      34.        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
      35.        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\a.jpg"));
      36.        int len;
      37.        byte[] bytes = new byte[1024];
      38.        while ((len = bis.read(bytes)) != -1){
      39.            bos.write(bytes,0,len);
      40.       }
      41.        bos.close();
      42.        //4.回写数据
      43.        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
      44.        bw.write("上传成功");
      45.        bw.newLine();
      46.        bw.flush();
      47.        //5.释放资源
      48.        socket.close();
      49.        ss.close();
      50.   }
      51. }

    练习四:文件名重复

     ```java
    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.   }

  • 相关阅读:
    设计模式教程
    李宏毅2022《机器学习/深度学习》——学习笔记(5)
    Obsidian配置
    视频讲解vue2基础之style样式class类名绑定
    java文件命令行报错: 找不到或无法加载主类XXX报错及解决
    计算机能转嵌入式吗?
    Chapter9.2:线性系统的状态空间分析与综合(上)
    智联汽车 — 自动/辅助驾驶技术
    算法竞赛进阶指南 0x65 负环与差分约数
    破局数据分析滞后难题,赋能企业高速增长的指标管理解决方案
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/133660474