Skip to content

Socket 通信

鸿蒙支持 TCP/UDP Socket 通信,用于本地通信、设备直连等场景。


1. Socket 类型

类型说明适用场景
TCP Socket可靠连接、面向字节流长连接、数据同步
UDP Socket无连接、面向数据报实时传输、广播
Local Socket本地进程通信同设备进程间通信

2. TCP Socket

2.1 客户端

typescript
import { socket } from '@kit.NetworkKit'

class TcpClient {
    private client: socket.Socket | null = null

    // 连接服务器
    connect(host: string, port: number): Promise<void> {
        return new Promise((resolve, reject) => {
            this.client = socket.createSocket(socket.SocketType.TCP)
            
            this.client.on('connect', () => {
                console.log('TCP 连接成功')
                resolve()
            })
            
            this.client.on('receive', (data: ArrayBuffer) => {
                console.log('收到数据:', new TextDecoder().decode(data))
            })
            
            this.client.on('error', (err: Error) => {
                console.error('连接错误:', err.message)
                reject(err)
            })
            
            this.client.connect({
                host: host,
                port: port,
                timeout: 5000
            })
        })
    }

    // 发送数据
    send(data: string): void {
        if (this.client) {
            let buffer = new TextEncoder().encode(data)
            this.client.send(buffer)
        }
    }

    // 断开连接
    disconnect(): void {
        if (this.client) {
            this.client.close()
            this.client = null
        }
    }
}

2.2 服务器端

typescript
import { socket } from '@kit.NetworkKit'

class TcpServer {
    private server: socket.Socket | null = null
    private connections: Array<socket.Socket> = []

    // 启动服务器
    start(port: number): Promise<void> {
        return new Promise((resolve, reject) => {
            this.server = socket.createSocket(socket.SocketType.TCP)
            
            this.server.on('connection', (client: socket.Socket) => {
                console.log('新连接:', client)
                this.connections.push(client)
                
                client.on('receive', (data: ArrayBuffer) => {
                    console.log('收到数据:', data)
                })
            })
            
            this.server.on('error', (err: Error) => {
                console.error('服务器错误:', err.message)
                reject(err)
            })
            
            this.server.listen({
                port: port,
                address: '0.0.0.0'
            })
            
            resolve()
        })
    }

    // 广播消息
    broadcast(data: string): void {
        let buffer = new TextEncoder().encode(data)
        for (let client of this.connections) {
            try {
                client.send(buffer)
            } catch (err) {
                this.connections.splice(this.connections.indexOf(client), 1)
            }
        }
    }
}

3. UDP Socket

3.1 UDP 客户端

typescript
import { socket } from '@kit.NetworkKit'

class UdpClient {
    private socket: socket.Socket | null = null

    // 创建 UDP Socket
    connect(): void {
        this.socket = socket.createSocket(socket.SocketType.UDP)
        
        this.socket.on('receive', (data: ArrayBuffer, address: socket.SocketAddress) => {
            console.log('收到 UDP 包:', new TextDecoder().decode(data))
            console.log('来自:', address.host, address.port)
        })
        
        this.socket.bind(0)  // 随机端口
    }

    // 发送 UDP 包
    send(data: string, host: string, port: number): void {
        if (this.socket) {
            let buffer = new TextEncoder().encode(data)
            this.socket.send({
                data: buffer,
                address: { host: host, port: port }
            })
        }
    }

    // 组播
    joinMulticast(multicastAddr: string, interfaceAddr: string): void {
        if (this.socket) {
            this.socket.joinMulticast({
                multicastAddr: multicastAddr,
                interfaceAddr: interfaceAddr
            })
        }
    }
}

4. Local Socket(本地通信)

4.1 本地通信

typescript
import { socket } from '@kit.NetworkKit'

// 服务端
let server = socket.createSocket(socket.SocketType.LOCAL)
server.listen({
    path: '/data/local/tmp/mysocket'
})

// 客户端
let client = socket.createSocket(socket.SocketType.LOCAL)
client.connect({
    path: '/data/local/tmp/mysocket'
})

5. 面试高频考点

Q1: TCP 和 UDP 的区别?

回答:TCP 可靠连接、面向字节流、有连接;UDP 无连接、面向数据报、无保证。TCP 用于数据同步/长连接,UDP 用于实时传输。

Q2: Local Socket 的用途?

回答:同设备进程间通信,通过本地文件路径通信,适合同设备进程间数据交换。


🐱 小猫提示:Socket 记住 "TCP 可靠、UDP 快速、Local 本地通信、TCP 面向连接 UDP 无连接"