4

.NET クライアントが接続してメッセージを交換できる単純なサーバーを作成しようとしています。どのクライアントからのメッセージでも、他のすべてのクライアントに送信されます。node.js + socket.io はここに行くには良い方法のようですが、問題があります。私は socket.io サイトのサンプル コードを使用しています。ブラウザーから接続すると、コンソールはすべての接続イベントとハートビート イベントを正常にトレースするので、少なくとも環境設定は正しく行われていると思います。 .

私のクライアント コード (以下に貼り付け) は、Socket クラスのサンプル コードと非常によく似ていますが、奇妙な動作をしています。「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');
});
4

1 に答える 1

1

独自のソケット コードを使用してこれを処理することができます。.Net との統合を処理するには、SocketIO4Net のようなライブラリを使用することをお勧めします。

SocketIO4Net - http://socketio4net.codeplex.com

于 2013-01-07T23:13:37.577 に答える