Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境搭建
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期與時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件與類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型性
- Java - 方法重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤與異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重 catch 塊
- Java - 巢狀 try 塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒連線
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - Socket 程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多發行版 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API 改進
- Java - Stream API 改進
- Java - 增強的 @Deprecated 註解
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 與框架
Java 類參考
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
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 |
關閉此套接字。 |
| 3 | void connect(SocketAddress endpoint) 將此套接字連線到伺服器。 |
| 4 | void connect(SocketAddress endpoint, int timeout) 使用指定的超時值將此套接字連線到伺服器。 |
| 5 |
返回與此套接字關聯的唯一 SocketChannel 物件(如果有)。 |
| 6 |
返回套接字連線到的地址。 |
| 7 |
返回此套接字的輸入流。 |
| 8 |
測試是否啟用了 SO_KEEPALIVE。 |
| 9 |
獲取套接字繫結的本地地址。 |
| 10 |
返回此套接字繫結的本地埠號。 |
| 11 | SocketAddress getLocalSocketAddress() 返回此套接字繫結的端點的地址。 |
| 12 |
測試是否啟用了 SO_OOBINLINE。 |
| 13 | <T> T getOption(SocketOption<T> name) 返回套接字選項的值。 |
| 14 | OutputStream getOutputStream() 返回此套接字的輸出流。 |
| 15 |
返回此套接字連線到的遠端埠號。 |
| 16 |
獲取此 Socket 的 SO_RCVBUF 選項的值,即平臺在此 Socket 上輸入使用的緩衝區大小。 |
| 17 | SocketAddress getRemoteSocketAddress() 返回此套接字連線到的端點的地址,如果未連線則返回 null。 |
| 18 |
測試是否啟用了 SO_REUSEADDR。 |
| 19 |
獲取此 Socket 的 SO_SNDBUF 選項的值,即平臺在此 Socket 上輸出使用的緩衝區大小。 |
| 20 |
返回 SO_LINGER 的設定。 |
| 21 |
返回 SO_TIMEOUT 設定。返回值為 0 表示該選項被停用(即超時時間為無限大)。 |
| 22 |
測試 TCP_NODELAY 是否啟用。 |
| 23 |
獲取從該 Socket 傳送的資料包的 IP 頭部中的流量類或服務型別。 |
| 24 |
返回套接字的繫結狀態。 |
| 25 |
返回套接字的關閉狀態。 |
| 26 |
返回套接字的連線狀態。 |
| 27 |
返回套接字連線的讀取部分是否已關閉。 |
| 28 |
返回套接字連線的寫入部分是否已關閉。 |
| 29 | void sendUrgentData(int data) 在套接字上傳送一個位元組的緊急資料。 |
| 30 |
啟用/停用 SO_KEEPALIVE。 |
| 31 |
啟用/停用 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 |
設定從該 Socket 傳送的資料包的 IP 頭部中的流量類或服務型別八位位元組。 |
| 42 |
將此套接字的輸入流置於“流結束”狀態。 |
| 43 |
停用此套接字的輸出流。 |
| 44 | Set<SocketOption<?>> supportedOptions() 返回此套接字支援的套接字選項集。 |
| 45 |
將此套接字轉換為字串。 |
客戶端示例
下面的 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!