我正试图编写一个简单的服务器,.NET客户端可以连接到交换消息。来自任何客户的任何消息将发送给所有其他消息。 node.js + socket.io似乎是一个很好的途径,但我遇到了麻烦。我使用来自socket.io站点的示例代码,当我通过浏览器连接到它时,控制台会根据需要跟踪所有连接和心跳事件,所以我认为我至少已经正确设置了环境。从C#连接到node.js服务器#
我的客户代码(粘贴在下面)与Socket类的example code非常相似,但它的行为很奇怪。在“ProcessConnect”处理程序中,e.LastOperation ==“Connect”和e.SocketError ==“Success”,但服务器端的连接事件处理程序未触发。另外奇怪的是,当代码发送“Hello World”时,接收处理程序也会被“Hello World”解锁。我知道这不是来自服务器,因为服务器上没有代码来执行此操作。我想也许套接字连接到自己或其他东西,但如果我关闭服务器,连接失败。
显然有一些基本的东西我错过了关于.NET套接字,但我不知道它是什么。
客户:
public class NodeClient
{
Socket _Socket;
public NodeClient()
{
SocketAsyncEventArgs socketState = new SocketAsyncEventArgs();
socketState.Completed += SocketState_Completed;
socketState.RemoteEndPoint = new DnsEndPoint("localhost", 81);
_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_Socket.ConnectAsync(socketState);
}
private void SocketState_Completed(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError != SocketError.Success)
{
throw new SocketException((int)e.SocketError);
}
switch (e.LastOperation)
{
case SocketAsyncOperation.Connect:
ProcessConnect(e);
break;
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
ProcessSend(e);
break;
default:
throw new Exception("Invalid operation completed.");
}
}
// Called when a ConnectAsync operation completes
private void ProcessConnect(SocketAsyncEventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("Hello World");
e.SetBuffer(buffer, 0, buffer.Length);
bool willRaiseEvent = _Socket.SendAsync(e);
if (!willRaiseEvent)
{
ProcessSend(e);
}
}
// Called when a ReceiveAsync operation completes
private void ProcessReceive(SocketAsyncEventArgs e)
{
string message = Encoding.UTF8.GetString(e.Buffer, 0, e.Buffer.Length);
}
// Called when a SendAsync operation completes
private void ProcessSend(SocketAsyncEventArgs e)
{
bool willRaiseEvent = _Socket.ReceiveAsync(e);
if (!willRaiseEvent)
{
ProcessReceive(e);
}
}
}
服务器:
var io = require('socket.io').listen(81);
io.sockets.on('connection', function (socket) {
console.log('connected yo');
});
这看起来非常有帮助!唯一的问题是我需要为Silverlight编译它。看起来这使用了许多在那里不可用的类。也许我可以将它移植... –