65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SocketIO4Net 库用 C# 进行 SocketIO 编程

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2013年5月26日

CPOL

6分钟阅读

viewsIcon

100457

downloadIcon

6427

SocketIO - 使用 SocketIO4Net 库在 C# 中进行 NodeJS 桌面编程。

引言

NodeJS 简介

如果您从事 Web 编程,您一定听说过 NodeJS 及其功能。NodeJS 是一个为开发高度可伸缩的 Web 应用程序而设计的服务器端软件系统。它由 Ryan Dahl 于 2009 年创建。NodeJS 是 Google V8 引擎的打包编译版本,V8 引擎是一个 JavaScript 引擎,随 Chrome 一起发布。V8 会在执行之前将 JavaScript 编译为本地机器代码,而不是在 JVM 中解释代码。V8 在运行时优化代码,并提供更高的性能和内联缓存。NodeJS 允许开发人员使用 JavaScript 开发前端和后端,从而实现轻松调试和无缝集成。NodeJS 实现异步 I/O,这意味着 NodeJS 中的所有函数调用/IO 操作都是非阻塞的,因此它提供了非常高的性能。

SocketIO

每个人都对 NodeJS 和 SocketIO 趋之若鹜。SocketIO 到底是什么?如果您在本教程之前就知道 NodeJS,那么您可能知道 SocketIO 是什么。SocketIO 只是一个用于开发实时 Web 应用程序(如聊天程序和股票市场监视器)的 JavaScript 库,这些应用程序必须始终与服务器保持“始终在线”的连接才能交付内容。SocketIO 有两个部分;一个用于 Web 浏览器的客户端库和一个用于 NodeJS 的服务器端库。与 NodeJS 一样,它的 API 也是事件驱动的。SocketIO 主要使用 WebSocket 协议进行内容交付。但是,它可以根据需要自动修改自身,并具有广播到所有客户端、存储每个客户端的独立数据等炫酷功能。

背景

如果您曾谷歌搜索过 SocketIO 教程,您一定注意到关于桌面编程语言与 SocketIO 的实际教程并不多。我想为我的家庭自动化系统开发一个从笔记本电脑控制的应用程序。我目前的实现使用了 NodeJS+Express+SocketIO,并且我能够使用 Web 界面控制所有内容。出于好奇,我想为同一事物开发一个桌面应用程序。我的后端运行良好,我不想重新设计它,也不想修改我的前端。因此,解决方案是模拟一个没有浏览器的 SocketIO 客户端。我谷歌搜索了一个小时左右,找到了很多关于 Java 中 SocketIO 的教程。它们都很好。但老实说,我不认为 Java 与 Windows 搭配得很好。我想要一种更纯粹的方法,但找不到。但是,我偶然发现了 J.W. Stott 在 CodePlex 上的 SocketIO4Net 库。但是,即使这样,我也找不到任何好的资源。不过,J.W. Stott 在 SocketIO4Net 页面上有一个很棒的示例代码。以此为基础,我尝试自己制作一个示例程序。就像所有现有的 SocketIO 教程一样,我开始制作一个聊天程序。

本教程假设您已在计算机上安装了 NodeJS 和 SocketIO,并且还安装了 Visual Studio 2012。要将 SocketIO4Net 安装到您的 Visual Studio 项目中,请从 https://nuget.net.cn/ 安装 NuGet 包管理器。安装该扩展后,打开 Visual Studio,转到“工具”>“库包管理器”>“程序包管理器控制台”。在程序包管理器控制台中,键入以下命令(不带 PM>),SocketIO4Net 客户端库将添加到您的项目中。

PM>Install-Package SocketIO4Net.Client

服务器端代码

说实话,我不喜欢使代码复杂化,我不知道这是否可以用更简单的方式完成。但这是我写的。

代码

var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
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('txt',name + ' is now online');
});
socket.on('exit', function (name) {
console.log(name,' Has Been Disconnected!');
io.sockets.emit('txt',name + ' is now offline');
});
}); 

我知道!没有花哨的代码或复杂的逻辑!此基础代码来自 SocketIO 网站上的一个示例。我对其进行了一些修改,使其能够回显接收到的任何消息。此服务器只是一个回显服务器,它将客户端的消息广播给所有已连接的客户端。当新用户连接时,它会回显新用户已连接。客户端发送客户端的用户名,服务器将其广播出去。此外,当用户发送一条消息(由“private message”事件指定)时,服务器也会将其回显,客户端将其作为“txt”事件接收。当用户断开连接时,客户端将发送一个“exit”事件以及用户名,服务器回显该用户已离线。

运行此代码时,您将看到以下屏幕。

NodeJS Chat Server Window 

服务器记录来自客户端的所有消息。该代码在 Ubuntu Server 12.04 LTS 上运行。唯一需要的修改是更改端口,因为您可能已经有 Apache 正在监听该端口。如果您使用 Ubuntu Server,您将看到以下屏幕(我使用 PuTTY 通过 SSH 与我的服务器通信)。

NodeJS Chat Server Program Output Ubuntu Server 12.04LTS

客户端

在客户端,我创建了一个 C# Winforms 应用程序,创建了几个窗口,添加了许多文本框和按钮,然后就完成了!我们有一个聊天应用程序!好吧,事实并非如此。但它很简单!SocketIO4Net.Client 与浏览器端的 SocketIO 客户端非常相似。例如,要注册服务器在新“private message”事件上发出的“txt”事件,代码如下:

socket.On("txt", (data) =>
{
String msg = data.Json.Args[0].ToString();
Console.Write(msg);
});  

这段代码的作用是,当服务器发出新的“txt”事件时,它会解析出发送的消息数据并在控制台上显示,就是这么简单!像这样,您可以注册任意数量的事件,每个事件将在自己的线程上执行。

关注点

缺点是,即使此代码在您的窗体内部,它也无法修改任何控件!例如,我有一个 Form1.cs 文件。我将此代码放在窗体的“InitializeComponent()”正下方。事件将被注册,但下面的代码将不起作用。

socket.On("txt", (data) =>
{
String msg = data.Json.Args[0].ToString();
textBox1.Text = msg;
Console.Write(msg);
}); 

是的,它不会起作用!但这会起作用。

socket.On("txt", (data) =>
{
String msg = data.Json.Args[0].ToString();
MessageBox.Show(msg);
Console.Write(msg);
}); 

这有效是因为 MessageBox 没有连接到 UI,因此可以从任何线程调用它。但是,GUI 控件则不然!它们在自己的线程上运行,需要使用 lambda 表达式来创建一个将在 UI 自身线程中执行的匿名委托。因此,要更新它,必须使用以下代码。

socket.On("txt", (data) =>
{
String msg = data.Json.Args[0].ToString();
if (textBox1.InvokeRequired)
   textBox1.Invoke(new Action(() => textBox1.Text += msg + Environment.NewLine));
Console.Write(msg);
});

这会按预期工作!

如何测试程序

确保您已安装 NodeJS 和 SocketIO。运行项目 NodeJS 文件夹中的“Start Server.bat”。接下来,编译 Visual Studio 项目并运行它,或者打开项目“Bin\Release”文件夹内的“SocketIO Group Chat Test.exe”并输入服务器详细信息。

Server Details

如果您在同一台计算机上运行服务器,请保持设置不变。否则,如果您有另一台计算机和端口上运行的服务器,只需输入该计算机的 IP 地址以及服务器监听的端口,然后单击“连接”。您应该会看到以下屏幕。

Chat Program

我尝试将 100 个客户端连接到我的服务器,它甚至毫不费力!NodeJS 太棒了!这可以轻松改进,以匹配当前市场上的聊天程序。这里的问题是,它仅支持群聊。但可以轻松修改以实现私聊。SocketIO4Net.Client 库棒极了!感谢 J.W. Stott 的努力!

您还可以从 Git Fork 该项目:https://github.com/vsaravind007/SocketIO4Net.CS.Tutorial

© . All rights reserved.