• JavaWeb——Socket学习


    目标

    由于SOCKET是对TCP的一种封装,那么即可以实现客户端(Client)与服务端(Server)聊天(C发一行再S发一行,不能多行或者带空格)
    数据传输格式:IO流

    方法

    菜鸟
    实现过程:

    • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
    • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
    • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
    • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
    • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
    • 在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      创建服务端

      学习了上面的类创建与方法后,接下来开始搭建服务端,我们在服务端里需要做到的是:
      0,设置服务器运行端口号与超时时间
      1,创建服务端socket,并返回 accept() 监听客户端
      2,连接成功后,等待客户端发送消息

      具体介绍看注释,英文注释可以启用,把发送消息的方式改为Buffer而不是IO流

      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      import java.net.SocketTimeoutException;
      import java.util.Scanner;
      
      public class Server extends Thread {
          private ServerSocket serverSocket;//创建 私有化服务器套
          Scanner scanner = new Scanner(System.in);
      //    BufferedWriter writer;
      //    BufferedReader reader;
      
          public Server(int port) throws IOException {//创建 服务器体 封装
              serverSocket = new ServerSocket(port); //引入 带有端口输入的服务器套
              serverSocket.setSoTimeout(10000000);//为 带有端口输入的服务器套 设置 超时时间
          }
      
          public void run() {
              while (true) {
                  try {
                      System.out.println("等待客户端连接,其端口号为:" + serverSocket.getLocalPort() + "...");//得到客户端输入的端口号
                      Socket server_socket = serverSocket.accept();//服务端 得到一个socket
                      System.out.println("客户端连接的地址:" + server_socket.getRemoteSocketAddress());//得到客户端地址
      
                      DataInputStream dataInputStream = new DataInputStream(server_socket.getInputStream());//得到socket的输入流
                      System.out.println("客户端响应:" + dataInputStream.readUTF());
      
                      DataOutputStream dataOutputStream = new DataOutputStream(server_socket.getOutputStream());//得到socket的输出流
                      dataOutputStream.writeUTF("谢谢连接我!" + server_socket.getLocalSocketAddress());
      
      //                reader = new BufferedReader(new InputStreamReader(server_socket.getInputStream()));
      //                writer = new BufferedWriter(new OutputStreamWriter(server_socket.getOutputStream()));
      //                new DataOutputStream(server_socket.getOutputStream());
      
                      while (true) {//无限循环的发送消息环节
                          System.out.print("客户端:");
                          System.out.println(dataInputStream.readUTF());
      //                    String message = reader.readLine();
      //                    System.out.println(message);
      
                          System.out.print("服务端:");
                          String message = scanner.next();
                          dataOutputStream.writeUTF(message + "\n");
      //                    writer.write(message + "\n");
      //                    writer.flush();
                      }
                  } catch (SocketTimeoutException t) {
                      System.out.println("socket超时了!");
                      break;
                  } catch (IOException e) {
                      e.printStackTrace();
                      break;
                  }
              }
          }
      
          public static void main(String[] args) {
              int port = Integer.parseInt(args[0]);//端口号创建
              try {
                  Thread thread = new Server(port);
                  thread.run();
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68

      创建客户端

      客户端的要求:
      0,输入连接主机名与端口号
      1,创建客户端socket(此时此socket即可与服务端进行交互了)

      import java.io.*;
      import java.net.Socket;
      import java.net.UnknownHostException;
      import java.util.Scanner;
      
      public class Client {
          public static void main(String[] args) {
              String serverName = args[0];
              Scanner scanner = new Scanner(System.in);
      //        BufferedWriter writer;
      //        BufferedReader reader;
              int port = Integer.parseInt(args[1]);
              try {
                  System.out.println("连接到服务器:" + serverName + ",端口号:" + port);
                  Socket client_socket = new Socket(serverName, port);//创建 客户端socket
                  System.out.println("远程服务器地址:" + client_socket.getRemoteSocketAddress());
      
                  DataOutputStream dataOutputStream = new DataOutputStream(client_socket.getOutputStream());//改装可写数据流的输出流到 服务端
                  dataOutputStream.writeUTF("你好!我是客户端:" + client_socket.getLocalSocketAddress());//数据流输出一下
      
                  DataInputStream dataInputStream = new DataInputStream(client_socket.getInputStream());//改装侦听 服务器发送来的消息
                  System.out.println("服务器响应:" + dataInputStream.readUTF());
      
      //            reader = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
      //            writer = new BufferedWriter(new OutputStreamWriter(client_socket.getOutputStream()));
      //            new DataOutputStream(client_socket.getOutputStream());
      
                  while (true) {
                      System.out.print("客户端:");
                      String message = scanner.next();
                      dataOutputStream.writeUTF(message + "\n");
      //                writer.write(message + "\n");
      //                writer.flush();
      
                      System.out.print("服务器:");
                      System.out.println(dataInputStream.readUTF());
      //                message = reader.readLine();
      //                System.out.println(message);
                  }
      
              } catch (UnknownHostException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48

      启动方式:

      1,先给两个文件编译成字节码文件 服务端:javac -encoding utf-8 Server客户端:javac -encoding utf-8 Client
      2,在服务端的目录下,服务端先启动,java Server.java 8080
      3,在客户端的目录下,客户端启动,java Client.java localhost 8080

  • 相关阅读:
    mindspore两日集训营202209-自定义算子 数据处理
    【Spring Boot】Web原生组件注入
    ULN2003步进电机驱动电路详解
    VPN技术简介
    关于RabbitMQ你了解多少?
    K-Means算法进行分类
    Docker:01 OverView
    编程技巧│php 之魔术方法详解
    linux /usr/lib/共享库为何几乎都有链接(像是快捷方式)?
    实战PyQt5:149-QChart图表之图例设置
  • 原文地址:https://blog.csdn.net/qq_52480906/article/details/126263211