从C#连接到node.js服务器

4
我正在尝试编写一个简单的服务器,用于.NET客户端连接以交换消息。来自任何客户端的任何消息都将发送到其他所有客户端。node.js + socket.io似乎是一个不错的选择,但我遇到了麻烦。我正在使用socket.io网站上的示例代码,并且当我从浏览器连接它时,控制台会按照应该的方式跟踪所有连接和心跳事件,因此我认为至少已经正确设置了环境。
我的客户端代码(如下所述)与Socket类的示例代码非常相似,但它的行为很奇怪。在“ProcessConnect”处理程序中,e.LastOperation ==“Connect”,而e.SocketError ==“Success”,但是服务器端的连接事件处理程序没有触发。还有一件奇怪的事情是,当代码发送“Hello World”时,接收处理程序也会被触发并返回“Hello World”。我知道这不是来自服务器的,因为服务器上没有这样的代码。我认为可能是socket连接到了自身或其他什么地方,但是如果关闭服务器,则连接失败。
显然,我对.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个回答

1

你可以尝试使用自己的套接字代码来处理这个问题。 我建议你使用像SocketIO4Net这样的库来处理与.Net的集成

SocketIO4Net - http://socketio4net.codeplex.com


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接