簡體   English   中英

從C#連接到node.js服務器

[英]Connecting to a node.js server from C#

我正在嘗試編寫一個.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');
});

您可以嘗試使用自己的套接字代碼來處理它。 我建議您使用像SocketIO4Net這樣的庫來處理與.Net的集成

SocketIO4Net - http://socketio4net.codeplex.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM