0
点赞
收藏
分享

微信扫一扫

新手小白的 Socket 课

在英文中,“Socket”有多个含义:插口; 灯座;(电源) 插座;承槽; 窝,但在计算机网络领域,Socket 主要指的是一种用于描述计算机网络中进行通信的端点(Endpoint),通常被译为“套接字”。具体来说,Socket 是一种编程接口,用于在网络上进行数据传输。

技术定义

  • Socket:一种软件结构,用于在计算机网络中进行数据传输的端点。
  • Endpoint:一个网络连接的一端,包括 IP 地址和端口号。

举个例子

想象一下两台计算机通过网络进行通信:

  1. IP 地址:类似于房子的地址,唯一标识网络上的一台设备。
  2. 端口号:类似于房子里的某个房间号,用于标识设备上的一个具体服务或应用程序。

当两个设备通过网络进行通信时,Socket 就是连接这两个设备的桥梁。每个设备的 Socket 包含其 IP 地址和端口号。

举例说明

  • 客户端 Socket:用于向服务器发送请求的端点。包含客户端的 IP 地址和一个随机分配的端口号。
  • 服务器 Socket:用于接收客户端请求的端点。包含服务器的 IP 地址和特定的端口号(例如,HTTP 服务的端口号是 80 或 443)。

基本工作流程

  1. 创建 Socket:客户端和服务器各自创建一个 Socket。
  2. 建立连接:客户端的 Socket 连接到服务器的 Socket。
  3. 数据传输:客户端和服务器通过 Socket 发送和接收数据。
  4. 关闭连接:通信结束后,双方关闭 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 在计算机网络中的作用就是在网络上的两个设备之间创建、维护和关闭连接,进行数据传输。

举报

相关推荐

0 条评论