发送二进制文件 TcpClient - 文件大于源

2023-12-02

为了涉足网络编程,我编写了一个小控制台应用程序来将 png 文件发送到服务器(另一个控制台应用程序)。服务器写入的文件比源 png 文件稍大。而且它不会打开。

客户端应用程序的代码是:

    private static void SendFile()
    {
        using (TcpClient tcpClient = new TcpClient("localhost", 6576))
        {
            using (NetworkStream networkStream = tcpClient.GetStream())
            {
                //FileStream fileStream = File.Open(@"E:\carry on baggage.PNG", FileMode.Open);

                byte[] dataToSend = File.ReadAllBytes(@"E:\carry on baggage.PNG");

                networkStream.Write(dataToSend, 0, dataToSend.Length);
                networkStream.Flush();

            }
        }

    }

服务器应用程序的代码是:

    private static void Main(string[] args)
    {
        Thread thread = new Thread(new ThreadStart(Listen));
        thread.Start();

        Console.WriteLine("Listening...");
        Console.ReadLine();
    }

    private static void Listen()
    {
        IPAddress localAddress = IPAddress.Parse("127.0.0.1");
        int port = 6576;
        TcpListener tcpListener = new TcpListener(localAddress, port);
        tcpListener.Start();

        using (TcpClient tcpClient = tcpListener.AcceptTcpClient())
        {
            using (NetworkStream networkStream = tcpClient.GetStream())
            {
                using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite))
                {
                    // Buffer for reading data
                    Byte[] bytes = new Byte[1024];
                    var data = new List<byte>();

                    int length;

                    while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        var copy = new byte[length];
                        Array.Copy(bytes, 0, copy, 0, length);
                        data.AddRange(copy);
                    }

                    BinaryFormatter binaryFormatter = new BinaryFormatter();
                    stream.Position = 0;
                    binaryFormatter.Serialize(stream, data.ToArray());
                }
            }

        }
        tcpListener.Stop();

写入文件的大小为24,103Kb,而源文件只有24,079Kb。

任何人都清楚为什么此操作失败吗?

Cheers


您正在使用 BinaryFormatter 编写输出。我非常确定这会在输出的开头添加一些字节来指示您要输出的类型(在本例中为 System.Byte[])。
只需将字节直接写入文件,而不使用格式化程序:

using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite))
{
    // Buffer for reading data
    Byte[] bytes = new Byte[1024];

    int length;

    while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0)
    {
        stream.Write(bytes, 0, length);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送二进制文件 TcpClient - 文件大于源 的相关文章

  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 有没有办法防止使用静态断言和类型特征两次派生类?

    我意识到这是一个人为的示例 但我想要进行编译检查以防止这种情况 class A class B public A class C public A class D public B public C BOOST STATIC ASSERT
  • 如何使用delphi xe3复制.pst等锁定文件

    我正在努力寻找以下问题的答案 任何和所有的帮助将不胜感激 我正在使用以下代码尝试在 Outlook 打开时复制 Outlook pst 文件 我无法让它成功 它不会给出错误 只是不复制文件 copyfile C Users Administ
  • 自动调整 JTable 列宽

    我需要 JTable 自动调整其列宽以适应内容 我找到了TableColumnAdjuster类非常有用 但有一个小问题 假设我有 5 栏 内容很短 在这种情况下 如果我使用自动调整器 它会根据内容设置前四列的宽度 并将所有其余空间分配给最
  • 更改intellij JVM

    我看到一条关于解决 Intellij 问题的评论 如果将 IntelliJ IDEA 使用的 Java 从与 IDEA 捆绑的 OpenJDK 切换到 Oracle JVM 则不会出现该问题 至少这可以作为一种解决方法 如何更改 Intel
  • 从最小化状态恢复窗口状态

    是否有一种简单的方法可以将最小化形式恢复到之前的状态 正常或最大化 我期待与单击任务栏 或右键单击并选择恢复 相同的功能 到目前为止 我已经有了这个 但是如果表单之前已最大化 它仍然会作为普通窗口返回 if docView WindowSt
  • 如何仅使用 CSS 设计“选择文件”按钮的样式

    我想尝试这样设计
  • C 中的字符串填充

    我编写了这个函数 该函数应该执行 StringPadRight Hello 10 0 gt Hello00000 char StringPadRight char string int padded len char pad int len
  • 熊猫read_excel

    我花了几个小时努力如何使用 pd read excel 读取 excel 文件 其中路径是网站地址 我发现该链接不会直接转到文件 而只是触发下载 有什么简单的方法可以解决吗 部分代码 link energy http unstats un
  • SQLiteOpenHelper 中的 onDowngrade() (或降级时不崩溃的另一种方法)

    对于 Java 来说非常陌生 使用我的应用程序 并决定将 DATABASE VERSION 降回 1 没有真正的原因 当我启动该应用程序时 它崩溃了 错误之一是 E AndroidRuntime 14905 原因 android datab
  • 如何使 Flask-WTForms 从标签名称列表动态更新标签?

    我使用 WTForms 定义数据过滤表单 其定义如下 我的目标是让用户为 BooleanFields 设置指定标签 我让每个用户为字段命名标签 并将字段名称保存到 Google 数据存储 class MainFilterForm Flask
  • 使用新的 FileReader API 和 DataURL 进行 Javascript 预览似乎效率低下

    我正在使用新的 FileReader API 在上传之前预览图像 这是使用 DataURL 完成的 但如果图像很大 DataURL 可能会很大 这对我来说尤其是一个问题 因为用户可能一次上传多个图像 而预览这些图像实际上大大减慢了我的浏览器
  • 如何通过 Selenium 的 --user-data-dir 参数打开 Chrome 配置文件

    我正在尝试使用我现有的帐户和个人资料中的设置加载带有 selenium 的 chrome 浏览器 我可以使用 ChromeOptions 设置 userdatadir 和配置文件目录来实现此功能 这会按照我想要的方式在浏览器中加载我的个人资
  • 将 Python / Numpy 代码转换为 Cython - 数组问题 - 缓冲区类型仅允许作为函数局部变量?

    我正在尝试将一些 Python Numpy 代码转换为 Cython 以提高速度 这是我的代码 cimport numpy as np import numpy as np from numpy import import pylab as
  • Django 使用 AWS ECS Fargate 迁移部署策略?

    使用 ECS Fargate 运行数据库迁移的建议部署策略是什么 我可以在启动 Gunicorn 服务器之前更新容器命令以运行迁移 但如果配置了多个实例 这可能会导致并发迁移同时执行 我还必须考虑图像已经在运行的事实 如果我弄清楚如何在新映
  • SVG 下的 jQuery

    有什么方法可以在 SVG 而不是 HTML 下运行 jQuery 吗 我知道关于jQuery svg 插件但这不是我想要的 目前 jQuery 引擎包含一些如下语句 div document createElement div div st
  • 为什么我不必在 for 循环中使用 range() 定义变量,但我必须在 Python 中的 while 循环中定义变量?

    我有以下使用 for 循环的代码 total 0 for num in range 101 total total num print total 现在使用 while 循环得到相同的结果 num 0 total 0 while num l
  • 在 R闪亮中保存传单地图

    我创建了一个应用程序 用户可以在其中修改传单地图 并且我想在 pdf 报告中使用此地图 我有 1 安装了leaflet webshot和htmlwidget包 2 安装PhantomJS 下面是代码的简化版本 服务器 R library s
  • 带有内容处置的文件:内联有时仍然提示下载

    我的主题行说了我要问的大部分内容 我有一个网站 可以输出各种格式的报告 HTML CSV TSV Excel 等 只要有可能 我希望这些文件显示在浏览器中 为此 我设置了标题 使 Content Disposition 成为 内联 这对于不
  • 索引未应​​用于索引视图

    我有一个索引视图 但是当我在该视图上运行查询时 不会应用基于视图构建的索引 并且查询在没有索引的情况下运行 下面是我的虚拟脚本 表 视图 视图上的索引 CREATE TABLE P Test PID INT IDENTITY TID INT
  • 发送二进制文件 TcpClient - 文件大于源

    为了涉足网络编程 我编写了一个小控制台应用程序来将 png 文件发送到服务器 另一个控制台应用程序 服务器写入的文件比源 png 文件稍大 而且它不会打开 客户端应用程序的代码是 private static void SendFile u