Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 與框架

Java 類參考

Java 有用資源

Java - Socket 類及示例



Sockets 使用 TCP 提供兩臺計算機之間的通訊機制。客戶端程式在其通訊端建立一個套接字,並嘗試將該套接字連線到伺服器。

連線建立後,伺服器在其通訊端建立一個套接字物件。客戶端和伺服器現在可以透過寫入和讀取套接字進行通訊。

java.net.Socket 類表示套接字,java.net.ServerSocket 類為伺服器程式提供了一種機制,用於監聽客戶端並與它們建立連線。

連線建立後,可以使用 I/O 流進行通訊。每個套接字都有 OutputStream 和 InputStream。客戶端的 OutputStream 連線到伺服器的 InputStream,客戶端的 InputStream 連線到伺服器的 OutputStream。

Java Socket 類表示客戶端和伺服器用來相互通訊的套接字。客戶端透過例項化一個 Socket 物件來獲取它,而伺服器從 accept() 方法的返回值獲取 Socket 物件。

宣告

public class Socket
   extends Object
      implements Closeable

建構函式

序號 方法與描述
1

public Socket()

此方法建立一個未連線的套接字,使用系統預設型別的 SocketImpl。

2

public Socket(String host, int port) throws UnknownHostException, IOException

此方法嘗試連線到指定埠上的指定伺服器。如果此建構函式沒有丟擲異常,則連線成功,客戶端已連線到伺服器。

3

public Socket(String host,int port,InetAddress localAddr,int localPort) throws IOException

此方法建立一個套接字並將其連線到指定的遠端主機上的指定遠端埠。套接字還將繫結()到提供的本地地址和埠。

4

public Socket(InetAddress host, int port) throws IOException

此方法與上一個建構函式相同,只是主機由 InetAddress 物件表示。

5

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

此方法與上一個建構函式相同,只是主機由 InetAddress 物件而不是 String 表示。

6

public Socket(Proxy proxy)

此方法建立一個未連線的套接字,指定應使用的代理型別(如果有),而不管任何其他設定如何。

當 Socket 建構函式返回時,它不僅例項化一個 Socket 物件,而且實際上還嘗試連線到指定的伺服器和埠。

方法

這裡列出 Socket 類中一些感興趣的方法。請注意,客戶端和伺服器都有一個 Socket 物件,因此這些方法可以由客戶端和伺服器呼叫。

序號 方法與描述
1

void bind(SocketAddress bindpoint)

將套接字繫結到本地地址。

2

void close()

關閉此套接字。

3

void connect(SocketAddress endpoint)

將此套接字連線到伺服器。

4

void connect(SocketAddress endpoint, int timeout)

使用指定的超時值將此套接字連線到伺服器。

5

SocketChannel getChannel()

返回與此套接字關聯的唯一 SocketChannel 物件(如果有)。

6

InetAddress getInetAddress()

返回套接字連線到的地址。

7

InputStream getInputStream()

返回此套接字的輸入流。

8

boolean getKeepAlive()

測試是否啟用了 SO_KEEPALIVE。

9

InetAddress getLocalAddress()

獲取套接字繫結的本地地址。

10

int getLocalPort()

返回此套接字繫結的本地埠號。

11

SocketAddress getLocalSocketAddress()

返回此套接字繫結的端點的地址。

12

boolean getOOBInline()

測試是否啟用了 SO_OOBINLINE。

13

<T> T getOption(SocketOption<T> name)

返回套接字選項的值。

14

OutputStream getOutputStream()

返回此套接字的輸出流。

15

int getPort()

返回此套接字連線到的遠端埠號。

16

int getReceiveBufferSize()

獲取此 Socket 的 SO_RCVBUF 選項的值,即平臺在此 Socket 上輸入使用的緩衝區大小。

17

SocketAddress getRemoteSocketAddress()

返回此套接字連線到的端點的地址,如果未連線則返回 null。

18

boolean getReuseAddress()

測試是否啟用了 SO_REUSEADDR。

19

int getSendBufferSize()

獲取此 Socket 的 SO_SNDBUF 選項的值,即平臺在此 Socket 上輸出使用的緩衝區大小。

20

int getSoLinger()

返回 SO_LINGER 的設定。

21

int getSoTimeout()

返回 SO_TIMEOUT 設定。返回值為 0 表示該選項被停用(即超時時間為無限大)。

22

boolean getTcpNoDelay()

測試 TCP_NODELAY 是否啟用。

23

int getTrafficClass()

獲取從該 Socket 傳送的資料包的 IP 頭部中的流量類或服務型別。

24

boolean isBound()

返回套接字的繫結狀態。

25

boolean isClosed()

返回套接字的關閉狀態。

26

boolean isConnected()

返回套接字的連線狀態。

27

boolean isInputShutdown()

返回套接字連線的讀取部分是否已關閉。

28

boolean isOutputShutdown()

返回套接字連線的寫入部分是否已關閉。

29

void sendUrgentData(int data)

在套接字上傳送一個位元組的緊急資料。

30

void setKeepAlive(boolean on)

啟用/停用 SO_KEEPALIVE。

31

void setOOBInline(boolean on)

啟用/停用 SO_OOBINLINE(TCP 緊急資料的接收)。預設情況下,此選項被停用,在套接字上接收到的 TCP 緊急資料將被靜默丟棄。

32

<T> Socket setOption(SocketOption<T> name, T value)

設定套接字選項的值。

33

void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

設定此套接字的效能偏好。

34

void setReceiveBufferSize(int size)

將此 Socket 的 SO_RCVBUF 選項設定為指定的值。

35

void setReuseAddress(boolean on)

啟用/停用 SO_REUSEADDR 套接字選項。

36

void setSendBufferSize(int size)

將此 Socket 的 SO_SNDBUF 選項設定為指定的值。

37

static void setSocketImplFactory(SocketImplFactory fac)

為應用程式設定客戶端套接字實現工廠。

38

void setSoLinger(boolean on, int linger)

啟用/停用 SO_LINGER,並指定以秒為單位的延遲時間。

39

void setSoTimeout(int timeout)

啟用/停用 SO_TIMEOUT,並指定以毫秒為單位的超時時間。

40

void setTcpNoDelay(boolean on)

啟用/停用 TCP_NODELAY(停用/啟用 Nagle 演算法)。

41

void setTrafficClass(int tc)

設定從該 Socket 傳送的資料包的 IP 頭部中的流量類或服務型別八位位元組。

42

void shutdownInput()

將此套接字的輸入流置於“流結束”狀態。

43

void shutdownOutput()

停用此套接字的輸出流。

44

Set<SocketOption<?>> supportedOptions()

返回此套接字支援的套接字選項集。

45

String toString()

將此套接字轉換為字串。

客戶端示例

下面的 GreetingClient 是一個客戶端程式,它使用套接字連線到伺服器,傳送問候語,然後等待響應。

示例

package com.tutorialspoint;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

下面的 GreetingServer 程式是一個伺服器應用程式示例,它使用 Socket 類監聽指定埠號上的客戶端(埠號由命令列引數指定)。

package com.tutorialspoint;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

編譯客戶端和伺服器,然後按如下方式啟動伺服器:

$ java GreetingServer 6066
Waiting for client on port 6066...
Just connected to /127.0.0.1:49462
Hello from /127.0.0.1:49462
Waiting for client on port 6066...

按如下方式檢查客戶端程式:

輸出

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!
廣告