在C#和Js之间通过套接字发送二进制数据

时间:2016-12-14 11:28:59

标签: javascript c# sockets websocket

我正在尝试在服务器(C#)应用程序和客户端之间发送二进制数据(js-application - 由WebSocket制作)。建立服务器和客户端之间的连接,握手正常。来自客户端的消息是由服务器接收的,但是当我尝试将二进制数据发送到客户端时,事件“onmessage”不起作用。 这是我的C#代码的片段。在“sendFile”函数中发送二进制数据。

class Listener
{
    private IPAddress ip;
    private int port;
    private TcpListener server;
    private TcpClient client;
    private NetworkStream stream;
    private bool isSuccHandshaked;

    public Listener()
    {
        ip = IPAddress.Loopback;
        port = 8080;
        server = new TcpListener(ip, port);
        isSuccHandshaked = false;
    }

    private void makeHandshake()
    {
        //...   
    }

    private String decodeMessage(Byte[] bytes)
    {
       //...
    }

    private void sendFile()
    {
        Byte[] dataToSend = File.ReadAllBytes("test.txt");
        stream.Write(datatosend, 0, datatosend.Length);
        stream.Flush();
    }

    public void startListen()
    {
        server.Start();
        Console.WriteLine("Server has started on {0}. Port: {1}. {2}Waiting for a connection...", ip, port, Environment.NewLine);

        client = server.AcceptTcpClient();
        Console.WriteLine("A client connected.");

        stream = client.GetStream();
        while (!isSuccHandshaked)
        {
            makeHandshake();
        }

        while (true)
        {
            if (client.Available > 0)
            {
                Byte[] bytes = new Byte[client.Available];
                stream.Read(bytes, 0, bytes.Length);
                String message = decodeMessage(bytes);
                sendFile();
            }
         }
    }
}

}

和js-code:

var address = 'ws://localhost:8080';
            var socket = new WebSocket(address);
            socket.binaryType = "arraybuffer";
            socket.onopen = function() {
                alert('handshake successfully established. May send data now...');
                socket.send("Aff");
            };
            socket.onclose = function() {
                alert('connection closed');
            };
            socket.onmessage = function(evt) {
                console.log("Receive message!");
                console.log("Got ws message: " + evt.data);
            }

使用WebSocket协议接收数据时可能存在一些特殊属性?您可以推荐哪些有用的方法将二进制数据从C#代码发送到js?

1 个答案:

答案 0 :(得分:1)

websocket不是原始TCP套接字。它使用HTTP协商和您必须遵守的自己的成帧协议。如果您有兴趣在C#中编写自己的服务器,请查看this

但是,如果您只想使用它们,则可以使用IIS的默认Microsoft实现,也可以使用众多独立的websockets组件之一。我维护了一个名为WebSocketListener