在当今的互联网应用中,实时通信变得越来越重要。无论是社交网络、在线游戏还是金融交易平台,都需要快速、实时地在客户端和服务器之间交换数据。JavaScript作为客户端脚本语言,虽然在前端开发中表现出色,但在服务器端的处理能力上却有所不足。因此,需要寻找能够在服务器端运行的解决方案。目前,Node.js和SignalR是两种流行的技术。
Node.js之所以受到青睐,首先是因为其能够为Web应用提供客户端到服务器端、服务器端到客户端的双向实时解决方案,使得数据能够在两端之间共享。此外,Node.js具有跨平台的特性,不需要复杂的安装和配置即可使用。它在I/O操作上表现出色,并且数据丢失的概率极低。
Node.js的架构设计允许数据在客户端和服务器之间流动,同时也可以与数据库进行连接。以下是一些使用Node.js连接数据库的解决方案:
在某些情况下,可能需要继续使用.NET平台,同时希望利用Node.js的优势。在这种情况下,可以通过WCF(Windows Communication Foundation)与MS SQL Server进行通信,而不是安装诸如node-ts、node-sqlserver、mssqlhelper、mssqlx、edge.js等驱动程序。
以下是使用C#和Node.js实现实时Web应用的基本步骤:
首先,需要创建一个新的Web应用程序项目,并添加一个类库项目用于数据访问层(DAL)的实现。
// C#代码示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using System.Data.Common;
namespace DAL
{
public abstract class DataAccess
{
public string ConnectionString
{
get
{
return "Data Source =DESKTOP-EVM02NE\\MAHSA; Initial Catalog = NodeByWCF; Integrated Security=true";
//return ConfigurationSettings.AppSettings["ConnectionString"].ToString();
}
}
protected Int32 ExecuteNonQuery(DbCommand cmd)
{
return cmd.ExecuteNonQuery();
}
protected IDataReader ExecuteReader(DbCommand cmd)
{
return ExecuteReader(cmd, CommandBehavior.Default);
}
protected IDataReader ExecuteReader(DbCommand cmd, CommandBehavior behavior)
{
return cmd.ExecuteReader(behavior);
}
protected object ExecuteScalar(DbCommand cmd)
{
return cmd.ExecuteScalar();
}
}
}
在DAL项目中,需要创建一个CustomerDAL类,用于访问数据库中的客户信息。
// C#代码示例
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DAL
{
public class CustomerDAL : DataAccess
{
public IEnumerable Load()
{
SqlConnection conn = new SqlConnection(ConnectionString);
SqlDataAdapter dAd = new SqlDataAdapter("select * from Customer", conn);
dAd.SelectCommand.CommandType = CommandType.Text;
DataTable dt = new DataTable();
try
{
dAd.Fill(dt);
foreach (DataRow row in dt.Rows)
{
yield return new Customer
{
ID = Convert.ToInt32(row["ID"]),
Name = (row["Name"]).ToString()
};
}
}
finally
{
dAd.Dispose();
conn.Close();
conn.Dispose();
}
}
}
}
接下来,需要创建一个CustomerBAL类,用于封装业务逻辑。
// C#代码示例
using DAL;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BAL
{
public class CustomerBAL
{
public IEnumerable Load()
{
CustomerDAL customer = new CustomerDAL();
try
{
return customer.Load();
}
catch
{
throw;
}
finally
{
customer = null;
}
}
}
}
为了实现与客户端的通信,需要创建一个WCF服务。
// C#代码示例
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using BAL;
using DAL;
using System.Web.Script.Serialization;
namespace WebApplication
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService
{
[OperationContract]
[WebGet()]
public string GetCustomer()
{
CustomerBAL _Cust = new CustomerBAL();
try
{
var customers = _Cust.Load();
string json = new JavaScriptSerializer().Serialize(customers);
return json;
}
catch (Exception)
{
throw;
}
finally
{
}
}
}
}
最后,需要创建一个Node.js服务器,用于处理客户端的请求。
// Node.js代码示例
var http = require("http");
var url = require('url');
var fs = require('fs');
var io = require('socket.io');
var port = process.env.port || 1337;
var server = http.createServer(function (request, response) {
var path = url.parse(request.url).pathname;
switch (path) {
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('hello world');
response.end();
break;
case '/Index.html':
fs.readFile(__dirname + path, function (error, data) {
if (error) {
response.writeHead(404);
response.write("page doesn't exist - 404");
response.end();
} else {
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(data, 'utf8');
response.end();
}
});
break;
default:
response.writeHead(404);
response.write("page this doesn't exist - 404");
response.end();
break;
}
});
server.listen(port);
var listener = io.listen(server);
listener.sockets.on('connection', function (socket) {
socket.emit('message', { 'message': 'Hello this message is from Server' });
socket.on('client_data', function (data) {
socket.emit('message', { 'message': data.name });
socket.broadcast.emit('message', { 'message': data.name });
process.stdout.write(data.name);
console.log(data.name);
});
});
最后,需要创建一个HTML页面,用于与Node.js服务器进行通信。
// HTML代码示例
<input id="text" type="text" />
<button id="send">send</button>
This is our conversation.