使用XSockets.Net发送大文件

时间:2014-05-12 12:47:27

标签: c# xsockets.net

我对.Net中的XSockets非常陌生。

以下是我的服务器代码。

public class MyChatController : XSocketController
{

    public void Foo(ITextArgs textArgs)
    {
        this.SendToAll(textArgs);
    }

}

以下是客户端代码

   static void Main(string[] args)
    {
        var client = new XSocketClient("ws://127.0.0.1:4502/MyChat","*");

        client.OnOpen += (sender, eventArgs) => Console.WriteLine("OPEN");
        client.Bind("foo", message=>
        {
            dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject(message.data);

            var array = data;

            byte[] bytes = Convert.FromBase64String(array);

            Stream readStream = new MemoryStream(bytes);//videovm.video
            var fileName = "C:\\Users\\NandaKishore\\Documents\\Visual Studio 2013\\Projects\\CSClientApp\\CSClientApp\\somefile" + ".mp4";

            string targetPath =  fileName;

            FileStream writeStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write);

            int Length = 256;
            Byte[] buffer = new Byte[Length];
            int bytesRead = readStream.Read(buffer, 0, Length);
            while (bytesRead > 0)
            {
                writeStream.Write(buffer, 0, bytesRead);
                bytesRead = readStream.Read(buffer, 0, Length);
            }
            readStream.Close();
            writeStream.Close();

            Console.WriteLine("done dona done");
        });
        client.Open();





        ConsoleKeyInfo cki;            
        Console.WriteLine("Press the Escape (Esc) key to quit and any other key to send a message: \n");

        var _FileName = "C:\\Users\\NandaKishore\\Documents\\Visual Studio 2013\\Projects\\CSClientApp\\CSClientApp\\tt.mp4";

        byte[] _Buffer = null;
        try
        {
            System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.BinaryReader _BinaryReader = new System.IO.BinaryReader(_FileStream);
            long _TotalBytes = new System.IO.FileInfo(_FileName).Length;
            _Buffer = _BinaryReader.ReadBytes((Int32)_TotalBytes);
            _FileStream.Close();
            _FileStream.Dispose();
            _BinaryReader.Close();
        }
        catch (Exception _Exception)
        {
            Console.WriteLine("Exception caught in process: {0}", _Exception.ToString());
        }

        do
        {
            cki = Console.ReadKey();
            if (cki.Key != ConsoleKey.Escape) {

                var dd = Convert.ToBase64String(_Buffer);
                client.Send(dd, "foo");
            }
        } while (cki.Key != ConsoleKey.Escape);
    }

适用于小型图片和视频,但视频较大时会失败。有没有更好的方法来传递大文件,如字节服务或任何东西。

任何指导都会有所帮助。

1 个答案:

答案 0 :(得分:0)

WebSockets不适合流式传输大型文件,但如果以小块的形式发送文件,则可以实现。这样做时,你永远不应该使用Base64字符串,因为Base64的平均大小比实际文件大36%。

因此切片文件并将其作为字节数组发送,并使用XSockets的二进制方法。在您的示例代码中,您使用的是ITextArgs而不是IBinaryArgs,这也是您使用Base64的原因...

您可以阅读有关二进制消息here

的更多信息

同时拥有ITextArgs和IBinaryArgs有点奇怪,但由于websockets对二进制消息的支持非常差,这就是目前在XSockets中完成的方式。从版本4.0(尚未发布)开始,IMessage将替换ITextArgs和IBinaryArgs,并且对处理所有类型的消息提供了更好的支持。