前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unix套接字进程通信初探【Go版本】

Unix套接字进程通信初探【Go版本】

作者头像
FunTester
发布2024-05-28 16:42:46
1170
发布2024-05-28 16:42:46
举报
文章被收录于专栏:FunTesterFunTester

最近看到一些资料,提到了在同一台机器上进程间通讯的方式:unix套接字。起初我还以为是Socket接口,因为用到了变量SocketPath。后面经过AI助理翻译,才知道原来这是我的知识盲区了。

现在赶紧把这块知识补充上。

Unix套接字简介

Unix套接字(Unix domain sockets)是一种用于同一主机上进程间通信(IPC,Inter-Process Communication)的机制。与网络套接字不同,Unix套接字不使用网络协议栈,因此性能更高。它们主要用于需要高效、低延迟的本地进程通信场景。

Unix套接字的类型

  1. 流套接字(SOCK_STREAM)
    • 提供面向连接的、可靠的字节流服务,类似于TCP。
    • 数据传输具有顺序和可靠性保障。
  2. 数据报套接字(SOCK_DGRAM)
    • 提供无连接的、消息为单位的数据传输,类似于UDP。
    • 数据传输不保证顺序和可靠性。

Unix套接字的工作流程

服务器端操作流程:
  1. 创建套接字:使用系统调用创建一个套接字文件描述符。
  2. 绑定套接字:将套接字绑定到一个文件系统路径,类似于网络套接字绑定到IP地址和端口。
  3. 监听连接:使套接字进入监听状态,准备接受客户端连接。
  4. 接受连接:当有客户端请求连接时,接受连接并创建一个新的套接字文件描述符用于通信。
  5. 通信:通过读写操作在服务器和客户端之间传输数据。
  6. 关闭套接字:完成通信后,关闭套接字并清理资源。
客户端操作流程:
  1. 创建套接字:使用系统调用创建一个套接字文件描述符。
  2. 连接到服务器:使用系统调用连接到服务器端的套接字路径。
  3. 通信:通过读写操作在客户端和服务器之间传输数据。
  4. 关闭套接字:完成通信后,关闭套接字并清理资源。

优点和应用场景

优点:
  1. 高效:由于不涉及网络协议栈的处理,Unix套接字具有更低的开销和更高的性能。
  2. 安全:Unix套接字只能在本地主机上使用,降低了网络攻击的风险。
  3. 简单:配置和使用比网络套接字更简单,不需要考虑网络配置和防火墙等问题。
典型应用场景:
  1. 本地进程通信:例如,系统服务之间或应用程序内部组件之间的通信。
  2. 高性能服务:需要高效、低延迟的本地服务,例如数据库服务(如MySQL)。
  3. 容器间通信:在容器化环境中,本地容器之间的通信。

Unix套接字是一种高效、可靠的本地进程间通信机制,适用于需要低延迟和高性能的应用场景。它们通过文件系统路径进行标识和通信,使用方便且配置简单,是本地主机上进程通信的重要工具。

Go语言实现

下面来用Go语言实现一个基于unix的服务端和客户端,并且模拟进行进程间的通讯。下期我们将会用Java&Groovy重新实现一遍。同时测试一下夸语音unix套接字进程间通讯。

服务端
代码语言:javascript
复制
// TestServer 测试服务端  
//  
//  @Description: 测试服务端  
//  @param t  
func TestServer(t *testing.T) {  
    if _, err := os.Stat(socketPath); err == nil {  
       os.Remove(socketPath) // 如果文件存在,删除文件  
    }  
    listener, err := net.Listen("unix", socketPath) // 监听,创建一个unix socket  
    if err != nil {  
       fmt.Println("监听发生异常:", err)  
       return  
    }  
    defer listener.Close() // 关闭监听  
    fmt.Println("服务启动...")  
    for { // 循环  
       conn, err := listener.Accept() // 接收连接  
       if err != nil {  
          fmt.Println("接受信息错误:", err)  
          return  
       }  
       go handleConnection(conn) // 处理连接  
    }  
}

其中处理连接的方法内容如下:

代码语言:javascript
复制
// handleConnection 处理连接  
//  
//  @Description: 处理连接  
//  @param conn  
func handleConnection(conn net.Conn) {  
    defer conn.Close()           // 关闭连接  
    buffer := make([]byte, 1024) // 创建一个缓冲区  
    n, err := conn.Read(buffer)  // 读取数据  
    if err != nil {              // 如果读取错误  
       fmt.Println("读取错误:", err)  
       return  
    }  
    fmt.Printf("收到消息: %s\n", string(buffer[:n])) // 打印接收到的数据  
}
客户端

客户端代码比较简单,实现了发送消息的功能。

代码语言:javascript
复制
// TestClient 测试客户端  
//  
//  @Description: 测试客户端  
//  @param t  
func TestClient(t *testing.T) {  
    conn, err := net.Dial("unix", socketPath)  
    if err != nil {  
       fmt.Println("拨号发生错误:", err)  
       return  
    }  
    defer conn.Close()  
    message := "Hello FunTester"  
    _, err = conn.Write([]byte(message))  
    if err != nil {  
       fmt.Println("写入消息错误:", err)  
       return  
    }  
}
测试控制台打印

经过多次发送消息,控制台打印信息如下:

代码语言:javascript
复制
服务启动...
收到消息: Hello FunTester
收到消息: Hello FunTester
收到消息: Hello FunTester

下期的Java和Groovy版本敬请期待!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unix套接字简介
  • Unix套接字的类型
  • Unix套接字的工作流程
    • 服务器端操作流程:
      • 客户端操作流程:
      • 优点和应用场景
        • 优点:
          • 典型应用场景:
          • Go语言实现
            • 服务端
              • 客户端
                • 测试控制台打印
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档