首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用XSockets.Net发送大文件

用XSockets.Net发送大文件
EN

Stack Overflow用户
提问于 2014-05-12 12:47:27
回答 1查看 480关注 0票数 1

我对XSockets in .Net非常陌生。

以下是我的服务器代码。

代码语言:javascript
复制
public class MyChatController : XSocketController
{

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

}

以下是客户端代码

代码语言:javascript
复制
   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);
    }

对于小图像和视频,它可以很好的工作,但是对于大的视频,它失败了。是否有更好的方法来传递大文件,如字节服务或其他任何东西。

任何指导都会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 07:02:22

WebSockets不适用于大文件流,但如果以小块发送文件,则可以实现。在这样做时,您不应该使用Base64字符串,因为Base64的平均大小将比实际文件大36%。

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

您可以阅读有关二进制消息这里的更多信息。

同时拥有ITextArgs和IBinaryArgs有点奇怪,但是由于websockets对二进制消息的支持非常差,所以目前在XSockets中就是这样做的。从4.0版(尚未发布)开始,IMessage将用更好的支持处理所有类型的消息来取代ITextArgs和IBinaryArgs。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23609492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档