go websocket

 

go client:

package main

import (
	"fmt"
	"github.com/gorilla/websocket"//这里使用的是 gorilla 的 websocket 库
	"log"
	"time"
)

func main() {
	//创建一个拨号器,也可以用默认的 websocket.DefaultDialer
	dialer := websocket.Dialer{}
	//向服务器发送连接请求,websocket 统一使用 ws://,默认端口和http一样都是80
	connect, _, err := dialer.Dial("ws://127.0.0.1/", nil)
	if nil != err {
		log.Println(err)
		return
	}
	//离开作用域关闭连接,go 的常规操作
	defer connect.Close()

	//定时向客户端发送数据
	go tickWriter(connect)

	//启动数据读取循环,读取客户端发送来的数据
	for {
		//从 websocket 中读取数据
		//messageType 消息类型,websocket 标准
		//messageData 消息数据
		messageType, messageData, err := connect.ReadMessage()
		if nil != err {
			log.Println(err)
			break
		}
		switch messageType {
		case websocket.TextMessage://文本数据
			fmt.Println(string(messageData))
		case websocket.BinaryMessage://二进制数据
			fmt.Println(messageData)
		case websocket.CloseMessage://关闭
		case websocket.PingMessage://Ping
		case websocket.PongMessage://Pong
		default:

		}
	}
}

func tickWriter(connect *websocket.Conn) {
	for {
		//向客户端发送类型为文本的数据
		err := connect.WriteMessage(websocket.TextMessage, []byte("from client to server"))
		if nil != err {
			log.Println(err)
			break
		}
		//休息一秒
		time.Sleep(time.Second)
	}
}

 

 

go server:

package main

import (
	"fmt"
	"github.com/gorilla/websocket"//这里使用的是 gorilla 的 websocket 库
	"log"
	"net/http"
	"time"
)

func main() {
	//websocket 的升级接口
	upgrader := websocket.Upgrader{}
	//go 标准库的 http 处理,这里处理的是根路径
	http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
		//通过 upgrader 将 http 连接升级为 websocket 连接
		connect, err := upgrader.Upgrade(writer, request, nil)
		if nil != err {
			log.Println(err)
			return
		}
		//离开作用域关闭连接,go 的常规操作
		defer connect.Close()

		//定时向客户端发送数据
		go tickWriter(connect)

		//启动数据读取循环,读取客户端发送来的数据
		for {
			//从 websocket 中读取数据
			//messageType 消息类型,websocket 标准
			//messageData 消息数据
			messageType, messageData, err := connect.ReadMessage()
			if nil != err {
				log.Println(err)
				break
			}
			switch messageType {
			case websocket.TextMessage://文本数据
				fmt.Println(string(messageData))
			case websocket.BinaryMessage://二进制数据
				fmt.Println(messageData)
			case websocket.CloseMessage://关闭
			case websocket.PingMessage://Ping
			case websocket.PongMessage://Pong
			default:

			}
		}
	})

	//go 标准库监听http
	err := http.ListenAndServe(":80", nil)
	if nil != err {
		log.Println(err)
		return
	}
}

func tickWriter(connect *websocket.Conn) {
	for {
		//向客户端发送类型为文本的数据
		err := connect.WriteMessage(websocket.TextMessage, []byte("from server to client"))
		if nil != err {
			log.Println(err)
			break
		}
		//休息一秒
		time.Sleep(time.Second)
	}
}

 

 

 

 

参考:

https://mingsailor.com/2019/02/04/websocket-go-client.html

https://mingsailor.com/2019/02/04/websocket-go-server.html

posted @   redrobot  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示