在英文中,“Socket”有多个含义:插口; 灯座;(电源) 插座;承槽; 窝,但在计算机网络领域,Socket 主要指的是一种用于描述计算机网络中进行通信的端点(Endpoint),通常被译为“套接字”。具体来说,Socket 是一种编程接口,用于在网络上进行数据传输。
技术定义
- Socket:一种软件结构,用于在计算机网络中进行数据传输的端点。
- Endpoint:一个网络连接的一端,包括 IP 地址和端口号。
举个例子
想象一下两台计算机通过网络进行通信:
- IP 地址:类似于房子的地址,唯一标识网络上的一台设备。
- 端口号:类似于房子里的某个房间号,用于标识设备上的一个具体服务或应用程序。
当两个设备通过网络进行通信时,Socket 就是连接这两个设备的桥梁。每个设备的 Socket 包含其 IP 地址和端口号。
举例说明
- 客户端 Socket:用于向服务器发送请求的端点。包含客户端的 IP 地址和一个随机分配的端口号。
- 服务器 Socket:用于接收客户端请求的端点。包含服务器的 IP 地址和特定的端口号(例如,HTTP 服务的端口号是 80 或 443)。
基本工作流程
- 创建 Socket:客户端和服务器各自创建一个 Socket。
- 建立连接:客户端的 Socket 连接到服务器的 Socket。
- 数据传输:客户端和服务器通过 Socket 发送和接收数据。
- 关闭连接:通信结束后,双方关闭 Socket 连接。
Swift 示例
使用 Network.framework
创建一个简单的 TCP 客户端 Socket 连接到服务器:
import Network
class SimpleTCPClient {
var connection: NWConnection?
func start(host: NWEndpoint.Host, port: NWEndpoint.Port) {
connection = NWConnection(host: host, port: port, using: .tcp)
connection?.stateUpdateHandler = { state in
switch state {
case .ready:
print("Connected to \(host) on port \(port)")
self.send(message: "Hello, server!")
case .failed(let error):
print("Failed to connect: \(error)")
default:
break
}
}
connection?.start(queue: .global())
}
func send(message: String) {
let data = message.data(using: .utf8)
connection?.send(content: data, completion: .contentProcessed({ error in
if let error = error {
print("Failed to send data: \(error)")
} else {
print("Message sent: \(message)")
self.receive()
}
}))
}
func receive() {
connection?.receive(minimumIncompleteLength: 1, maximumLength: 1024, completion: { (data, _, isComplete, error) in
if let data = data, !data.isEmpty {
let response = String(data: data, encoding: .utf8)
print("Received response: \(response ?? "")")
}
if isComplete {
self.connection?.cancel()
} else if let error = error {
print("Failed to receive data: \(error)")
} else {
self.receive()
}
})
}
}
// 使用示例
let client = SimpleTCPClient()
client.start(host: "localhost", port: 8080)
总结
Socket 在计算机网络中的作用就是在网络上的两个设备之间创建、维护和关闭连接,进行数据传输。