1. 程式人生 > >Java Socket套接字

Java Socket套接字

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();
          }
      }