使用套接字与计算引擎上的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);
}
});
}
};
总之,我采取了以下步骤:
- 创建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"事件发出。
希望这能帮助那些在未来与如此简单的问题作斗争的人。感谢所有在我缺乏信息的情况下尽力帮助我的人。
你说应用引擎监听请求?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