只是demo,生产环境要防止粘包。可以作为多进程之间通讯。。。。
server
package main
import (
"fmt"
"net"
"os"
"os/signal"
"sync"
"syscall"
)
type Client struct {
Conn *net.UnixConn
}
var clients = make(map[*Client]bool)
var clientsLock = &sync.Mutex{}
func main() {
listener, err := net.ListenUnix("unix", &net.UnixAddr{Name: "my.sock", Net: "unix"})
if err != nil {
fmt.Println("Error listening:", err)
return
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Received interrupt, stopping...")
os.Remove("my.sock")
os.Exit(1)
}()
defer listener.Close()
for {
conn, err := listener.AcceptUnix()
if err != nil {
fmt.Println("Error accepting:", err)
continue
}
client := &Client{Conn: conn}
clientsLock.Lock()
clients[client] = true
clientsLock.Unlock()
go handleConnection(client)
}
}
func handleConnection(client *Client) {
defer func() {
clientsLock.Lock()
delete(clients, client)
clientsLock.Unlock()
}()
buf := make([]byte, 1024)
for {
n, err := client.Conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err)
return
}
broadcast(buf[:n], client)
}
}
func broadcast(message []byte, sender *Client) {
clientsLock.Lock()
defer clientsLock.Unlock()
for client, _ := range clients {
if client != sender {
client.Conn.Write(message)
}
}
}
client可以有多个,发消息给服务器,然后服务器进行转发
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.DialUnix("unix", nil, &net.UnixAddr{Name: "my.sock", Net: "unix"})
if err != nil {
fmt.Println("Error dialing:", err)
os.Exit(1)
}
defer conn.Close()
go func() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
conn.Write([]byte(input.Text() + "\n"))
}
}()
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err)
return
}
fmt.Printf("Received data: %s\n", buf[:n])
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!