go 服務(wù)端
使用到github.com/gorilla/websocket
package main
import (
"fmt"
"github.com/gorilla/websocket"
"log"
"net/http"
)
func main() {
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true //允許跨域
},
}
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { //將所有的請求轉(zhuǎn)換為websocket
upgrader.CheckOrigin = func(r *http.Request) bool {
return true
}
conn, err := upgrader.Upgrade(writer, request, nil)
if err != nil {
log.Fatal(err)
}
for {
t, msg, err := conn.ReadMessage()
if err != nil {
fmt.Printf("read error:%v\n", err)
break
}
fmt.Printf("[ws]recv count:%d recv:%s,msg type:%d\n", len(msg), string(msg), t)
}
})
err := http.ListenAndServe("127.0.0.1:8081", nil)
if err != nil {
log.Fatal(err)
}
}
C#客戶端
C#操作websocket當(dāng)客戶端使用時使用System.Net.Websockets
這個命名空間下的ClientWebSocket
類
winform的設(shè)計界面如下:
代碼如下:
public partial class Form1 : Form
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
System.Net.WebSockets.ClientWebSocket client = new System.Net.WebSockets.ClientWebSocket();
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
try
{
var content=this.rtbContent.Text;
if (string.IsNullOrEmpty(content))
{
MessageBox.Show("請輸入內(nèi)容來發(fā)送");
return;
}
if (client.State != System.Net.WebSockets.WebSocketState.Open)
{
tokenSource = new CancellationTokenSource();
client = new System.Net.WebSockets.ClientWebSocket();
//client.Options.KeepAliveInterval = TimeSpan.FromSeconds(1);
await client.ConnectAsync(new Uri("ws://127.0.0.1:8081"), tokenSource.Token);
var bytes = new byte[10240];
var array = new ArraySegment<byte>(bytes);
Task.Factory.StartNew(async () =>
{
while (true)
{
try
{
var msg = await client.ReceiveAsync(array, tokenSource.Token);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
tokenSource.Cancel();
return;
}
}
});
}
var buffer = Encoding.UTF8.GetBytes(content);
await client.SendAsync(new ArraySegment<byte>(buffer), System.Net.WebSockets.WebSocketMessageType.Text, true, tokenSource.Token);
MessageBox.Show($"已發(fā)送{buffer.Length}個字節(jié)");
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}
}
}
注意:無論是客戶端斷開還是服務(wù)端斷開,如果正在讀取消息,則會觸發(fā)錯誤。利用此機(jī)制可以很方便的處理重連問題。文章來源:http://www.zghlxwxcb.cn/news/detail-740139.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-740139.html
到了這里,關(guān)于websocket實現(xiàn)go(server)與c#(client)通訊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!