当前位置: 首页 > 科技观察

两个Go程序之间的WebSocket通信

时间:2023-03-18 20:11:31 科技观察

如何实现两个Go服务之间的WebSocket通信?本文对其进行介绍。使用WebSockets时,程序必须充当服务器。但是可以有许多其他程序作为客户端。在本文中,我们将创建一个服务器和一个客户端WebSocketServer服务器代码非常简单。由于我们不想重新发明轮子,我们将使用gobwas模块下面是运行在端口8080上的WebSocket服务器的代码packagemainimport("fmt""github.com/gobwas/ws""github.com/gobwas/ws/wsutil""math/rand""net/http""strconv")funcmain(){fmt.Println("Serverstarted,waitingforconnectionfromclient")http.ListenAndServe(":8080",http.HandlerFunc(func(whttp.ResponseWriter,r*http.Request){fmt.Println("Clientconnected")conn,_,_,err:=ws.UpgradeHTTP(r,w)iferr!=nil{fmt.Println("Errorstartingsocketserver:"+err.Error())}gofunc(){deferconn.Close()for{msg,op,err:=wsutil.ReadClientData(conn)iferr!=nil{fmt.Println("Errorreceivingdata:"+err.Error())fmt.Println("Clientdisconnected")return}fmt.Println("Clientmessagereceivedwithrandomnumber:"+string(msg))randomNumber:=strconv.Itoa(rand.Intn(100))err=wsutil.WriteServerMessage(conn,op,[]byte(randomNumber))iferr!=nil{fmt.Println("错误发送数据:"+err.Error())fmt.Println("Clientdisconnected")return}fmt.Println("Servermessagesendwithrandomnumber"+randomnumber)}}()}))}服务器除了等待连接什么都不做,打印接收到的数据和最后发送一条消息(随机整数)如果客户端断开连接(或有人停止程序)它打印有关此断开连接的信息WebSocketClient客户端的代码类似于同样,我们将使用gobwas模块客户端连接到端口8080上的本地主机os""strconv""time")funcmain(){fmt.Println("Clientstarted")for{conn,_,_,err:=ws.DefaultDialer.Dial(context.Background(),"ws://127.0.0.1:8080/"iferr!=nil{fmt.Println("无法连接:"+err.Error())time.Sleep(time.Duration(5)*time.Second)continue}fmt.Println("Connectedtoserver")fori:=0;i<10;i++{randomNumber:=strconv.Itoa(rand.Intn(100))msg:=[]byte(randomNumber)err=wsutil.WriteClientMessage(conn,ws.OpText,msg)iferr!=nil{fmt.Println("Cannotsend:"+err.Error())continue}fmt.Println("Clientmessagesendwithrandomnumber"+randomNumber)msg,_,err:=wsutil.ReadServerData(conn)iferr!=nil{fmt.Println("无法接收数据:"+err.Error())continue}fmt.Println("Servermessagereceivedwithrandomnumber:"+string(msg))time.Sleep(time.Duration(5)*time.Second)}err=conn.Close()iferr!=nil{fmt.Println("无法关闭连接:"+err.Error())os.Exit(1)}fmt.Println("Disconnectedfromserver")}}这个客户端除了连接之外没有做任何特别的事情,发送消息(随机整数)并打印返回的内容,服务器结果在右侧,客户端结果客户端每5秒向服务器发送一个随机数,服务器用另一个随机数回复如果您停止服务器,您将在客户端看到服务器已断开连接。如果您再次启动服务器,客户端将再次连接。你可以期待相反的行为。如果你停止客户端,服务器将打印一条消息,表明客户端已断开连接。如果你再次运行客户端......好吧,它再次连接,因为Go是通常用于服务和/或微服务,因此在这些服务之间进行通信很有意义。