使用套接字与计算引擎上的Node.js服务器代码通信.io和c#客户端

本文关键字:通信 代码 服务器 io 客户端 js Node 套接字 计算 引擎 | 更新日期: 2023-09-27 18:06:21

我目前有一个计算引擎和应用程序引擎工作和一个c#客户端应用程序。我的目标是将我的c#客户端应用程序与谷歌云连接起来,并实时处理请求和websocket。

为此,在阅读了大量文档和指南之后,我决定采用以下逻辑:

  • 发送请求到应用引擎,
  • 用Compute Engine监听App Engine,然后
  • 使用websocket连接向c#应用程序发送响应。

为此,我尝试使用socket.io,但没有任何运气。

这里的问题是我的mydomain.appspot.com url工作正常,至少它显示了一个文本没有任何变化。

我在我的终端上得到Listening port xxxx,但没有发生任何变化。

我觉得我正在听一些东西,但实际上并没有连接到它,所以.connect下的代码不运行。

    我该怎么做才能解决这个问题?我误解了这个概念吗?
  • 我在端口65080上添加了防火墙规则,这是我正在使用的。

我得到Port is in use错误(退出状态码8错误,但我查了一下,这意味着)当我监听任何端口时,然而当我在该端口上显示活动进程时,没有。

除了官方书架教程中的配置外,我还应该在Google Cloud部分进行其他配置吗?

服务器代码

var io = require('socket.io').listen(65080);
io.sockets.on('connection', function (socket) {
  var address = socket.handshake.address;
  console.log('New connection from ' + address.address + ':' + address.port);
io.sockets.emit('this', { will: 'be received by everyone'});
socket.on('private message', function (msg) {
console.log('New Chat Message ', msg);
io.sockets.emit('txt',msg);
});
socket.on('disconnect', function () {
io.sockets.emit('User Disconnected');
});
socket.on('newuser', function (name) {
console.log(name,' Is Now Connected!');
io.sockets.emit('txnpm start
                t',name + ' is now online');
});
socket.on('exit', function (name) {
console.log(name,' Has Been Disconnected!');
io.sockets.emit('txt',name + ' is now offline');
});
});
客户机代码

 Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        user = "x";
        MyForm = new Form1();
        temp = new Form2();
        Application.Run(temp);
        try
        {
            socket = new Client(ip.ToString());
            socket.On("txt", (data) =>
            {
                //MessageBox.Show(data.RawMessage);
                String msg = data.Json.Args[0].ToString();
                Console.Write(msg);
                MyForm.update(msg);
                //MessageBox.Show(msg, "Received Data");
            });
            socket.Connect();
             }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString(),"Something Went Wrong!!");
            Application.Exit();
        }
        if (socket.ReadyState.ToString() == "Connecting")
        {
            userset();
            Application.Run(MyForm);
        }
        else
        {
            MessageBox.Show("Failed To Connect To Server!", "Error!");
            Application.Exit();
        }       

,和

    using (var ws = new WebSocketSharp.WebSocket("ws://104.197.217.126:65080/"))
        {
            ws.OnMessage += (sender, e) =>
              MessageBox.Show(e.Data);
            ws.Connect();               
        }
编辑:

还在客户端尝试了一种不同的方法,通过遵循socket提供的客户端Android代码。io,只是为了确保问题是否与我的c#客户端代码。还是没有结果,还是那样。

Android客户端代码

Socket mSocket;
Activity activity;
     public void  connect(Activity a){
     activity=a;
         try {
             mSocket = IO.socket("http://104.197.217.126:65080");
         } catch (URISyntaxException e) {}
         mSocket.on("new message", onNewMessage);
         mSocket.connect();
        //  mSocket.emit("new message", "sadasdasd");
     }
private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                JSONObject data = (JSONObject) args[0];
                String username;
                String message;
                try {
                    username = data.getString("username");
                    message = data.getString("message");
                } catch (JSONException e) {
                    return;
                }
                // add the message to view
                Toast.makeText(activity,username+"-"+message,Toast.LENGTH_LONG);
            }
        });
    }
};

使用套接字与计算引擎上的Node.js服务器代码通信.io和c#客户端

总之,我采取了以下步骤:

  • 创建Compute Engine实例,安装节点和其他所需模块
  • 使用我在服务器端添加到我的问题的代码。为此,我首先将Node.js项目添加到GitHub,然后通过简单地连接SSH并使用git clone http://github.com/username/repname.git
  • 将其部署到我的计算引擎实例中。然后,在我的项目目录中,我使用"node app.js"启动了.js文件,它进入空闲状态,等待连接。这都是服务器端。对于客户端,我使用了错误的库。我需要使用插座。IO客户端库与我的套接字交互。所以我使用这个库为我的c#客户端应用程序,但你可以使用其他套接字。
  • 我的客户端代码是这样的:

     var socket = IO.Socket("http://104.198.214.221:65080"); 
     // this ip has to be your instance's external IP, left to the SSH button on your Compute Engine instances page.
        socket.On(Socket.EVENT_CONNECT, () =>
        {
            socket.Emit("private message", "Hello. I'm connected!");
        });
        socket.On("private message", (data) =>
        {
            MessageBox.Show(data.ToString());
            socket.Disconnect();
        });
    
  • Bam !由于我的服务器代码在实例计算机上运行,当客户端应用程序连接函数调用时,我收到了"New Connection from: bla:bla"消息,然后也收到了"private message"事件发出。

这是我第一次犯的错误。首先要确保的是您正在使用套接字。IO客户端库,否则它将无法工作。其次,您需要使用http://,而不是ws://或wss://连接到您的IP和端口。

希望这能帮助那些在未来与如此简单的问题作斗争的人。感谢所有在我缺乏信息的情况下尽力帮助我的人。

你说应用引擎监听请求?WS请求还是HTTP请求?

我注意到了一些事情。

默认情况下,除非客户端库允许您指定端口,否则所有的ws url应该看起来像ws://104.197.217.126:65080或简单的104.197.217.126:65080。我建议也许坚持默认的port:6455起初。

您也不需要使用GAE + CCE来运行ws服务器。使用GCE要直接得多。您可以仅为ws运行单个CGE实例。

但是既然你提到了GAE,我就假设你使用了那些"应用引擎上的nodejs"教程之一来开始。这里的问题是,目前这是目前在测试。应用引擎将创建GCE实例来运行代码,但代码只能通过.appspot.com域访问。所以myapp.appspot.com:65080可以工作

我仍然不清楚你的设置架构,如果你需要 GAE,但除此之外,nodejs代码似乎很好,应该自己工作。

我建议使用Websocket.org做一些更多的测试,如果你如何连接到ws连接。

我做了一些测试:

好像是套接字。IO是专门为与socket一起运行而构建的。IO客户端库。因此,尝试从标准的ws库访问ws连接将导致令人头痛的问题。这是因为实际套接字。io Uri将类似于ws://127.0.0.1:8000/socket.io/?EIO=3&transport=polling&t=1474301877690-0

我找到了一个为socket构建的库。IO,但尚未测试。

https://github.com/Quobject/SocketIoClientDotNet

另外,我可以使用标准的ws库和websocket node.js库来查看一些工作。

try out https://github.com/websockets/ws