在现代的网络编程领域,NodeJS和SocketIO是两个不得不提的技术。NodeJS是一个用于开发高性能、可扩展的Web应用程序的服务器端软件系统,由Ryan Dahl在2009年创建。它基于Google的V8引擎,这是一个与Chrome浏览器一同发布的JavaScript引擎。V8引擎在执行前将JavaScript编译成原生机器代码,而不是在JVM中解释执行代码。V8在运行时优化代码,并提供更高的性能和内联缓存。NodeJS允许开发者使用JavaScript来开发前端和后端,使得调试变得简单,并且能够无缝集成。NodeJS实现了异步I/O,意味着所有的函数调用/IO操作都是非阻塞的,因此它提供了非常高的性能。
SocketIO是一个JavaScript库,用于开发实时Web应用程序,如聊天程序和股市监控器,这些应用程序必须始终保持与服务器的“始终在线”连接,以便交付内容。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。要在Visual Studio项目中安装SocketIO4Net,请从http://nuget.org/安装NuGet包管理器。安装完这个扩展后,打开Visual Studio,转到Tools>Library Package Manager>Package Manager Console。在包管理器控制台中,输入以下命令(不带PM>),SocketIO4Net客户端库将被添加到项目中:
PM>Install-Package SocketIO4Net.Client
服务器端代码
作者不喜欢复杂的代码,他不知道这是否可以用更简单的方法完成。但这就是代码:
JavaScript
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”事件,以及用户的名称,服务器回显该用户已离线。
当运行这段代码时,会得到以下屏幕: 服务器记录了所有来自客户端的消息。代码在Ubuntu服务器12.04LTS上运行。唯一需要修改的是,端口必须改变,因为可能已经有Apache在监听那个端口。如果使用的是Ubuntu服务器,会得到以下屏幕(作者使用PuTTY通过SSH与服务器通信):
客户端
在客户端,作者创建了一个C# Winforms应用程序,创建了几个窗口,放入了一些文本框和按钮,瞧!有了一个聊天应用程序!好吧,它并不完全是那样。但是,它很简单!SocketIO4Net.Client与浏览器的SocketIO客户端非常相似。例如,注册由服务器在新的“private message”事件上发出的事件“txt”,代码是:
C#
socket.On("txt", (data) => {
String msg = data.Json.Args[0].ToString();
Console.Write(msg);
});
这段代码的作用是,当服务器发出新的“txt”事件时,它将解析出发送的消息数据,并在控制台上显示它,就这么简单!像这样,可以注册尽可能多的事件,每个事件都将在自己的线程上执行。