golang websocket conn.close关闭错误_Websockets 与在golang中的应用
Network socket
Network socket或socket是一臺(tái)或多臺(tái)服務(wù)器中不同應(yīng)用程序之間相互通信的接口.socket可以用于不同的網(wǎng)絡(luò)協(xié)議, 如HTTP, FTP等. 切不同的sockets可以同時(shí)存在.
Network sockets類型如下:
- Datagram sockets(SOCK_DGRAM), 即無鏈接的sockets, 使用UDP協(xié)議(User Datagram Protocol).
- Stream sockets(SOCK_STREAM), 即面向鏈接的sockets, 使用TCP協(xié)議(Transmission Control Protocol), SCTP協(xié)議(Stream Control Transmission Protocol), 或者DCCP協(xié)議(Datagram Congestion Control Protocol).
- Raw sockets(or raw IP sockets)常見于路由和其他網(wǎng)絡(luò)設(shè)備. 應(yīng)用程序中不常用.
socket通信
主機(jī)間的通信主要有TCP和UDP.
TCP Sockets
客戶端代碼
// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil {// handle error } conn, err := net.DialTCP(network, nil, tcpAddr) if err != nil {// handle error }// send message _, err = conn.Write({message}) if err != nil {// handle error }// receive message var buf [{buffSize}]byte _, err := conn.Read(buf[0:]) if err != nil {// handle error }服務(wù)端代碼
// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr)if err != nil {// handle error}listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil {// handle error }// listen for an incoming connection conn, err := listener.Accept() if err != nil {// handle error }// send message if _, err := conn.Write({message}); err != nil {// handle error } // receive message buf := make([]byte, 512) n, err := conn.Read(buf[0:]) if err != nil {// handle error }UDP Socket
客戶端代碼
// init raddr, err := net.ResolveUDPAddr("udp", address) if err != nil {// handle error }conn, err := net.DialUDP("udp", nil, raddr) if err != nil {// handle error }....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFrom(buffer) if err != nil {// handle error }....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteTo(buffer[:n], addr) if err != nil {// handle error }服務(wù)端代碼
// init udpAddr, err := net.ResolveUDPAddr(resolver, serverAddr) if err != nil {// handle error }conn, err := net.ListenUDP("udp", udpAddr) if err != nil {// handle error }....... // send message buffer := make([]byte, maxBufferSize) n, addr, err := conn.ReadFromUDP(buffer) if err != nil {// handle error }....... // receive message buffer := make([]byte, maxBufferSize) n, err = conn.WriteToUDP(buffer[:n], addr) if err != nil {// handle error }WebSocket
WebSocket是在單個(gè)TCP鏈接上建立可以雙向通信的渠道. 即不同于http(s), 客戶端需要發(fā)送請求(request)之后才能得到相應(yīng)(Response). 客戶端可以發(fā)送消息, 也可以等待服務(wù)端的消息, 服務(wù)端也是如此. 更多WebSocket協(xié)議可以查看: RFC 6455 specification.
WebSocket客戶端請求:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com服務(wù)端響應(yīng)
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat用golang創(chuàng)建WebSocket
基于net/http類庫創(chuàng)建WebSocket
大致步驟如下:
具體查看原文: https://yalantis.com/blog/how-to-build-websockets-in-go/
通過第三方類庫GOBWAS創(chuàng)建WebSocket
go get github.com/gobwas/ws客戶端代碼
// init // schema – can be ws or wss // host, port – ws server conn, _, _, err := ws.DefaultDialer.Dial(ctx, {schema}://{host}:{port}) if err != nil {// handle error }....... // send message err = wsutil.WriteClientMessage(conn, ws.OpText, {message}) if err != nil {// handle error }....... // receive message msg, _, err := wsutil.ReadServerData(conn) if err != nil {// handle error }服務(wù)器端代碼
// init listener, err := net.Listen("tcp", op.Port) if err != nil {// handle error } conn, err := listener.Accept() if err != nil {// handle error } upgrader := ws.Upgrader{} if _, err = upgrader.Upgrade(conn); err != nil {// handle error }....... // receive message for { reader := wsutil.NewReader(conn, ws.StateServerSide)_, err := reader.NextFrame()if err != nil {// handle error}data, err := ioutil.ReadAll(reader)if err != nil {// handle error}....... } ....... // send message msg := "new server message" if err := wsutil.WriteServerText(conn, {message}); err != nil {// handle error }主流第三方Websocket類庫有:
- http://golang.org/x/net/websocket
- http://github.com/gorilla/websocket
- http://github.com/gobwas/ws
- http://github.com/sacOO7/gowebsocket
(先告一段落,后續(xù)再修改)
總結(jié)
以上是生活随笔為你收集整理的golang websocket conn.close关闭错误_Websockets 与在golang中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FLASH怎么给骰盅做透视眼镜查看骰子点
- 下一篇: cgr指的是什么文件格式