Golang实现简易聊天程序应该选择哪个Socket库?
Golang实现简易聊天程序应该选择哪个Socket库? 你好!我想开发一个聊天应用程序。服务器应该用Go语言编写,客户端用C#(WPF)编写。但我的问题是:
- 我应该使用哪种套接字?我听说过WebSocket和Unix套接字^^
- 我应该使用哪个库/包?我知道Gorilla的WebSocket库、Socket-io以及内置的net包。
- C#程序员应该选择异步编程还是同步编程?
此致, Lockna
3 回复
- 使用 WebSockets
- 是的,Gorilla 是一个相当不错的库。你在 WPF C# 中需要一个 nu-get 包 (WebSocketSharp)
- 使用异步可以使你的客户端应用程序对其他事件响应更迅速
以上仅为个人浅见
对于你的聊天程序需求,我建议以下技术方案:
1. 套接字选择:WebSocket
推荐使用WebSocket而非Unix套接字,原因:
- WebSocket是跨平台的,适合C#客户端与Go服务器的通信
- Unix套接字主要用于同一台机器上的进程间通信
- WebSocket天然支持浏览器客户端,便于后续扩展
2. Go语言库选择:内置net/http + Gorilla WebSocket
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
type Client struct {
conn *websocket.Conn
send chan []byte
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
client := &Client{
conn: conn,
send: make(chan []byte, 256),
}
go client.writePump()
client.readPump()
}
func (c *Client) readPump() {
defer c.conn.Close()
for {
_, message, err := c.conn.ReadMessage()
if err != nil {
break
}
// 处理收到的消息
log.Printf("Received: %s", message)
}
}
func (c *Client) writePump() {
defer c.conn.Close()
for {
select {
case message, ok := <-c.send:
if !ok {
c.conn.WriteMessage(websocket.CloseMessage, []byte{})
return
}
err := c.conn.WriteMessage(websocket.TextMessage, message)
if err != nil {
return
}
}
}
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
log.Fatal(http.ListenAndServe(":8080", nil))
}
3. C#客户端编程模式:异步编程
使用System.Net.WebSockets.ClientWebSocket的异步API:
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
public class ChatClient
{
private ClientWebSocket _webSocket = new ClientWebSocket();
public async Task ConnectAsync(string uri)
{
await _webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
_ = Task.Run(ReceiveMessages);
}
public async Task SendMessageAsync(string message)
{
var buffer = System.Text.Encoding.UTF8.GetBytes(message);
await _webSocket.SendAsync(
new ArraySegment<byte>(buffer),
WebSocketMessageType.Text,
true,
CancellationToken.None);
}
private async Task ReceiveMessages()
{
var buffer = new byte[1024];
while (_webSocket.State == WebSocketState.Open)
{
var result = await _webSocket.ReceiveAsync(
new ArraySegment<byte>(buffer),
CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
// 处理接收到的消息
Console.WriteLine($"Received: {message}");
}
}
}
}
这个组合方案提供了跨平台兼容性、良好的性能和易用性。Gorilla WebSocket库在Go生态中广泛使用,而C#的异步WebSocket API能够高效处理并发连接。

