Golang 网络套接字处理程序
Golang websocket handler
我在 Node.js 写了很长时间后开始学习 Golang,我有点好奇如何实现处理程序 - 自从我选择使用 Gorilla Websocket我知道它是目前最可靠的软件包。
例如,在 socket.io 中,您有简单的 socket.on 函数,它允许我根据 JSON 中传递的 "name" 参数调用函数。
Gorilla websocket 没有实现这样的东西,所以我的问题是我是否要实现 socket.io 背后的逻辑以实现我想要的?
根据 websocket 中传输的值执行特定程序?
如果是这样 - 我需要在客户端(我在前端使用 AngularJS )和服务器端分别实现它 - 根据我得到的值制作一个 switch case 语句在 JSON 中,在 AngularJS 中用于前端,在 Go 中用于后端,而且 - 这是最有效的方法吗?
谢谢!
如果您已经使用 Javascript 一段时间,那么实现您自己的 socket.on
版本真的很容易,socket.emit
这是我为自己的项目制作的版本,但是需要的话可以拿去
// e.g.
// let socket = new Socket("ws://w/e");
// socket.on('connected', () => { console.log('Connected'); });
// socket.emit('lobby join', { data: { username: 'Boo' } });
// Using ES2015 with Babel
import {EventEmitter} from 'events';
class Socket {
constructor(wsurl, ee = new EventEmitter()) {
let ws = new WebSocket(wsurl);
this.ee = ee;
this.ws = ws;
ws.onmessage = this.message.bind(this);
ws.onopen = this.open.bind(this);
ws.onclose = this.close.bind(this);
}
on(name, fn) {
this.ee.on(name, fn);
}
off(name, fn) {
this.ee.removeListener(name, fn);
}
emit(name, data) {
const message = JSON.stringify({name, data});
this.ws.send(message);
}
message(e) {
try {
const msgData = JSON.parse(e.data);
this.ee.emit(msgData.name, msgData.data);
}
catch(err) {
let error = {
message: err
}
console.log(err)
this.ee.emit(error.message)
}
}
open() {
this.ee.emit('connected');
}
close() {
this.ee.emit('disconnected');
}
}
export default Socket
这将使您可以使用常用的 socket.on('event', fn);
而不是
关于服务器端处理:
为了接收消息,我个人只是做了一个 switch 语句,将传入的字符串与函数匹配,例如:
// readPump pumps messages from the websocket connection to the hub.
func (c *connection) readPump() {
defer c.ws.Close()
for {
_, message, err := c.ws.ReadMessage()
if err != nil {
break
}
var incMessage interface{}
err = json.Unmarshal(message, &incMessage)
if err != nil {
log.Println(err)
}
incMessageMap := incMessage.(map[string]interface{})
switch incMessageMap["name"] {
case "lobby join":
// Do something to handle joining
case "lobby leave":
// Do something to handle leaving
}
}
}
为了发送它们,我在存储在地图中的连接上有一个 send channel
,当我需要发出时,我有一个简单的结构,它接受消息名称和数据,例如:
type wsMsg struct {
Name string `json:"name"`
Data map[string]interface{} `json:"data"`
}
c.send <- wsMsg{
"user joined",
map[string]interface{}{
"username": "Booh",
},
}
那么在客户端它会变成
socket.on('user joined', (msg) => {
console.log(msg) // { username: "Booh" }
});
我建议看一下关于大猩猩的例子 git:https://github.com/gorilla/websocket/tree/master/examples/chat
这是一个使用 golang websocket 流式传输视频的工作示例
https://github.com/interviewparrot/OpenAVStream
让我知道它是否足够好
我在 Node.js 写了很长时间后开始学习 Golang,我有点好奇如何实现处理程序 - 自从我选择使用 Gorilla Websocket我知道它是目前最可靠的软件包。
例如,在 socket.io 中,您有简单的 socket.on 函数,它允许我根据 JSON 中传递的 "name" 参数调用函数。
Gorilla websocket 没有实现这样的东西,所以我的问题是我是否要实现 socket.io 背后的逻辑以实现我想要的?
根据 websocket 中传输的值执行特定程序?
如果是这样 - 我需要在客户端(我在前端使用 AngularJS )和服务器端分别实现它 - 根据我得到的值制作一个 switch case 语句在 JSON 中,在 AngularJS 中用于前端,在 Go 中用于后端,而且 - 这是最有效的方法吗?
谢谢!
如果您已经使用 Javascript 一段时间,那么实现您自己的 socket.on
版本真的很容易,socket.emit
这是我为自己的项目制作的版本,但是需要的话可以拿去
// e.g.
// let socket = new Socket("ws://w/e");
// socket.on('connected', () => { console.log('Connected'); });
// socket.emit('lobby join', { data: { username: 'Boo' } });
// Using ES2015 with Babel
import {EventEmitter} from 'events';
class Socket {
constructor(wsurl, ee = new EventEmitter()) {
let ws = new WebSocket(wsurl);
this.ee = ee;
this.ws = ws;
ws.onmessage = this.message.bind(this);
ws.onopen = this.open.bind(this);
ws.onclose = this.close.bind(this);
}
on(name, fn) {
this.ee.on(name, fn);
}
off(name, fn) {
this.ee.removeListener(name, fn);
}
emit(name, data) {
const message = JSON.stringify({name, data});
this.ws.send(message);
}
message(e) {
try {
const msgData = JSON.parse(e.data);
this.ee.emit(msgData.name, msgData.data);
}
catch(err) {
let error = {
message: err
}
console.log(err)
this.ee.emit(error.message)
}
}
open() {
this.ee.emit('connected');
}
close() {
this.ee.emit('disconnected');
}
}
export default Socket
这将使您可以使用常用的 socket.on('event', fn);
而不是
关于服务器端处理:
为了接收消息,我个人只是做了一个 switch 语句,将传入的字符串与函数匹配,例如:
// readPump pumps messages from the websocket connection to the hub.
func (c *connection) readPump() {
defer c.ws.Close()
for {
_, message, err := c.ws.ReadMessage()
if err != nil {
break
}
var incMessage interface{}
err = json.Unmarshal(message, &incMessage)
if err != nil {
log.Println(err)
}
incMessageMap := incMessage.(map[string]interface{})
switch incMessageMap["name"] {
case "lobby join":
// Do something to handle joining
case "lobby leave":
// Do something to handle leaving
}
}
}
为了发送它们,我在存储在地图中的连接上有一个 send channel
,当我需要发出时,我有一个简单的结构,它接受消息名称和数据,例如:
type wsMsg struct {
Name string `json:"name"`
Data map[string]interface{} `json:"data"`
}
c.send <- wsMsg{
"user joined",
map[string]interface{}{
"username": "Booh",
},
}
那么在客户端它会变成
socket.on('user joined', (msg) => {
console.log(msg) // { username: "Booh" }
});
我建议看一下关于大猩猩的例子 git:https://github.com/gorilla/websocket/tree/master/examples/chat
这是一个使用 golang websocket 流式传输视频的工作示例 https://github.com/interviewparrot/OpenAVStream
让我知道它是否足够好