Java Socket套接字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chennai1101/article/details/84783794

1. Socket

Socket主要用来收发服务器数据。

  • 主要方法

      socket.getInputStream()     // 接收服务器输入
      socket.getOutputStream()    // 发送服务器输出
      socket.getInetAddress()     // 服务器地址
      socket.getPort()            // 服务器端口号
      socket.getLocalAddress()    // 本地地址
      socket.getLocalPort()       // 本地端口号
      socket.shutdownInput()      // 半关闭输入
      socket.shutdownOutput()     // 半关闭输出
    
  • Socket 的选项

    • TCP_NODELAY,是否使用Nagle算法。对应方法setTcpNoDelay(boolean) 设置为true表示立即发送数据包。
    • SO_TIMEOUT,指定系统等待的时间。对应方法setSoTimeout(int) 设置0为一直等待,为默认值。
    • SO_LINGER,指定Socket关闭后如何处理尚未发送的数据包。对应方法setSoLinger(boolean, int)设置为true时,close()方法会被阻塞指定的秒数,等待发送数据和接受确认。
    • SO_SNDBUF,设置发送缓存区大小。对应方法setSendBufferSize(int)
    • SO_RCV_BUF,设置接收缓存区大小。对应方法setReceiveBufferSize(int)
    • SO_KEEPALIVE,设置是否与服务器保持连接。对应方法setKeepAlive(boolean)
    • OOBINLINE,发送单字节紧急数据。socket.setOOBInline(boolean),socket.sendUrgentData(int)。
    • SO_REUSEADDR,是否允许重用Socket所绑定的本地地址。对应方法setReuseAddress(boolean)
    • IP_TOS,设置不同性能要求。对应方法setTrafficClass(int)

2. Socket进行TCP通信

  • 服务端

      int TCP_SERVER_PORT = 1234;
    
      // 创建一个ServerSocket对象
      ServerSocket serverSocket = null;
      try {
          serverSocket = new ServerSocket(TCP_SERVER_PORT);
          // 监听连接请求
          Socket socket = serverSocket.accept();
          // 获取输入流
          BufferedReader in = new BufferedReader(new 	
                  InputStreamReader(socket.getInputStream()));
          // 获取输出流
          BufferedWriter out = new BufferedWriter(new	
                  OutputStreamWriter(socket.getOutputStream()));
          // 读取接收信息,转换为字符串
          String incomingMsg = in.readLine();
          System.out.println(incomingMsg);
    
          String outgoingMsg = "receive data from port " + TCP_SERVER_PORT
                  + System.getProperty("line.separator");
          out.write(outgoingMsg);
          out.flush();
    
          socket.close();
      } catch (Exception e) {	
          e.printStackTrace();
      } finally {
          if (serverSocket != null) {
              try {
                  serverSocket.close();
              } catch (IOException e) {
              }
          }
      }
    
  • 客户端

      String serverIp = "127.0.0.1";
      int TCP_SERVER_PORT = 1234;
    
      try {
          Socket socket = new Socket(serverIp, TCP_SERVER_PORT);
          // 获取输入流
          BufferedReader in = new BufferedReader(new InputStreamReader(
                  socket.getInputStream()));
          // 生成输出流
          BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                  socket.getOutputStream()));
    
          String outMsg = "Socket TCP connecting to " + TCP_SERVER_PORT
                  + System.getProperty("line.separator");
          out.write(outMsg);
          out.flush();
    
          String inMsg = in.readLine();
          System.out.println(inMsg);
    
          // 关闭连接
          socket.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
    

3. Socket进行UDP通信

  • 服务端

      int UDP_SERVER_PORT = 1234;
      int MAX_LEN = 1024;
    
      byte[] buffer = new byte[MAX_LEN];
      DatagramPacket dp = new DatagramPacket(buffer, MAX_LEN);
    
      // 新建一个DatagramSocket类
      DatagramSocket ds = null;
      try {
          // UDP服务器监听的端口
          ds = new DatagramSocket(UDP_SERVER_PORT);
          // 准备接收数据
          ds.receive(dp);
          System.out.println(new String(dp.getData(), 0, dp.getLength()));
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          if (ds != null) {
              ds.close();
          }
      }
    
  • 客户端

      String serverIp = "127.0.0.1";
      int UDP_SERVER_PORT = 1234;
      byte[] buffer = ("data from UDP client " + UDP_SERVER_PORT).getBytes();
    
      //新建一个DatagramSocket对象
      DatagramSocket ds = null;
      try {
          ds = new DatagramSocket();
          //初始化InetAddress对象
          InetAddress serverAddr = InetAddress.getByName(serverIp);
    
          //初始化DatagramPacket对象
          DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
                  serverAddr, UDP_SERVER_PORT);
          ds.send(dp);
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          if (ds != null) {
              ds.close();
          }
      }
    

猜你喜欢

转载自blog.csdn.net/chennai1101/article/details/84783794