Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Golang websocket搬运机_Javascript_Angularjs_Go_Websocket_Socket.io - Fatal编程技术网

Javascript Golang websocket搬运机

Javascript Golang websocket搬运机,javascript,angularjs,go,websocket,socket.io,Javascript,Angularjs,Go,Websocket,Socket.io,在Node.js中编写了很长一段时间之后,我开始学习Golang,我对如何实现处理程序有点好奇——我选择使用Gorilla Websocket,因为我知道它是最可靠的软件包 例如,在socket.io中有一个简单的socket.on函数,它允许我根据JSON中传递的“name”参数调用函数 Gorilla websocket没有实现这样的功能,所以我的问题是,我是否应该实现socket.io背后的逻辑,以实现我想要的功能 如中所述,是否有基于websocket中传输的值的特定过程 如果是这样的话

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

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

Gorilla websocket没有实现这样的功能,所以我的问题是,我是否应该实现socket.io背后的逻辑,以实现我想要的功能

如中所述,是否有基于websocket中传输的值的特定过程

如果是这样的话——我需要在客户端(我在前端使用AngularJS)和服务器端分别实现它——根据我在AngularJS中为前端和在Go中为后端获得的JSON值生成一个switch case语句,并且——这是最有效的方法吗


谢谢

如果您已经使用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
        }
    }
}
为了发送它们,我在连接上有一个存储在映射中的
发送通道
,当我需要发送时,我有一个简单的结构,它包含消息名称和数据,例如:

type wsMsg struct {
    Name string                 `json:"name"`
    Data map[string]interface{} `json:"data"`
}


c.send <- wsMsg{
     "user joined",
     map[string]interface{}{
          "username": "Booh",
     },
}

我建议看一下gorillas git上的示例:

这里是golang websocket的一个视频流示例


让我知道它是否足够好

太好了!这也是Go中最有效的方法还是简单的Go-to解决方案?@Random我只使用Go几个月,所以就效率而言我不确定,但我从来没有遇到过这种方法的问题,而且它看起来一点也不慢。我的实现平均大约有5-10k并发连接,它从不打嗝——这既复杂又烦人。为什么不使用googollee/go-socket.io为什么gorilla/websocket中有更多的星星-当回答一个老问题时,如果您包含一些上下文来解释您的答案如何有帮助,尤其是对于一个已经有公认答案的问题,那么您的答案对其他StackOverflow用户会更有用。请参阅:。
socket.on('user joined', (msg) => {
    console.log(msg) // { username: "Booh" }
});