javascript - Golang 网络套接字处理程序

标签 javascript angularjs go websocket socket.io

我在用 Node.js 编写了很长时间后开始学习 Golang,我对如何实现处理程序有点好奇 - 我选择使用 Gorilla Websocket,因为我知道它是最那里有可靠的包裹。

例如,在 socket.io 中,您有一个简单的 socket.on 函数,它允许我根据 JSON 中传递的“name”参数调用一个函数。

Gorilla websocket 没有实现这样的东西,所以我的问题是我是否要实现 socket.io 背后的逻辑以实现我想要的?

是否根据 websocket 中传输的值执行特定程序?

如果是这样 - 我需要在客户端(我在前端使用 AngularJS)和服务器端分别实现它 - 根据我在 AngularJS 中的 JSON 中获得的值制作一个 switch case 语句前端和 Go 用于后端,而且 - 这是最有效的方式吗?

谢谢!

最佳答案

如果您已经使用 Javascript 一段时间了,那么实现您自己的 socket.onsocket.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
        }
    }
}

为了发送它们,我在存储在 map 中的连接上有一个发送 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" }
});

我建议查看 gorillas git 上的示例:https://github.com/gorilla/websocket/tree/master/examples/chat

关于javascript - Golang 网络套接字处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34628021/

相关文章:

javascript - Normalizr 转换模式的麻烦

javascript - 如何验证 Rails form_for 是否已在客户端完全填写?

performance - go 应用程序的 pprof CPU 配置文件不显示任何示例

mongodb - 将 mgo 与转换为 map[string]interface{} 的嵌套文档一起使用。如何遍历 map ?

javascript - 操作json数据和简单的for语句

javascript - 如何获得主干分页以返回正确的长度?

JavaScript 变量作用域 - 正确使用

javascript - 在 AngularJS 中以 CSV、Excel、PDF 格式导出数据

javascript - $http.get从jpg到img

go - 在 Golang 中,为什么 conn.Write tcp 响应为空?