2013-01-07 167 views
2

我正试图编写一个简单的服务器,.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'); 
}); 

回答

1

你可以尝试处理这个使用自己的套接字代码。 我会建议你使用像SocketIO4Net 库来处理与.net

SocketIO4Net整合 - http://socketio4net.codeplex.com

+0

这看起来非常有帮助!唯一的问题是我需要为Silverlight编译它。看起来这使用了许多在那里不可用的类。也许我可以将它移植... –