今天是:2025年8月9日  星期六
企业介绍      荣誉资质      招贤纳士      服务业务     
企业新闻      行业新闻      网站公告      技术文章     
回转库      立体库      RGV      仓库温湿度监控系统      仓库滴漏检测系统      分拣线系统      注油器(设备润滑系统)      三坐标移载系统      纸质包装机      机器人系统      实用人才培训     
新闻动态
联系我们
Contanct
地址: 长沙市
电话: 13142150073
电话: 13272468550
Email: hncsdxw@163.com
当前位置:网站首页 >>新闻动态 >>技术文章 技术文章
C#如何通过TCP 发送实数
日期:2025-05-23 浏览次数:126

C#中使用Socket来发送实数(例如doublefloat类型)时,你需要将实数转换为字节序列,因为Socket是基于字节流的。可以使用BinaryFormatter或者BinaryWriter来完成这一转换。这里我将展示两种常见的方法:

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

 

class Program

{

    static void Main()

    {

        // 服务器地址和端口

        string server = "127.0.0.1";

        int port = 11000;

 

        // 创建Socket对象

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

       

        try

        {

            // 连接到服务器

            socket.Connect(server, port);

            Console.WriteLine("Connected to server.");

 

            // 要发送的实数

            double numberToSend = 123.456;

 

            // 创建一个MemoryStreamBinaryWriter来写入数据

            using (MemoryStream ms = new MemoryStream())

            {

                using (BinaryWriter writer = new BinaryWriter(ms))

                {

                    // 写入double类型的数据

                    writer.Write(numberToSend);

                    byte[] data = ms.ToArray(); // 获取所有写入的数据作为字节数组

 

                    // 发送数据到服务器

                    socket.Send(data);

                    Console.WriteLine("Data sent.");

                }

            }

        }

        catch (Exception e)

        {

            Console.WriteLine("Exception: " + e.Message);

        }

        finally

        {

            // 关闭Socket连接

            socket.Shutdown(SocketShutdown.Both);

            socket.Close();

        }

    }

}

方法2:使用BinaryFormatter(不推荐) 虽然可以使用BinaryFormatter,但这种方法在现代C#开发中通常不推荐使用,因为它依赖于.NET的二进制序列化格式,这在跨平台或未来的版本中可能会导致兼容性问题。不过,如果你仍然需要使用它,可以这样做:

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Runtime.Serialization.Formatters.Binary;

 

class Program

{

    static void Main()

    {

        string server = "127.0.0.1";

        int port = 11000;

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try

        {

            socket.Connect(server, port);

            Console.WriteLine("Connected to server.");

            double numberToSend = 123.456;

            BinaryFormatter bf = new BinaryFormatter(); // 创建BinaryFormatter实例

            using (MemoryStream ms = new MemoryStream()) // 创建MemoryStream用于序列化数据

            {

                bf.Serialize(ms, numberToSend); // 序列化数据到MemoryStream

                byte[] data = ms.ToArray(); // 获取序列化后的数据作为字节数组

                socket.Send(data); // 发送数据到服务器

                Console.WriteLine("Data sent.");

            }

        }

        catch (Exception e) { Console.WriteLine("Exception: " + e.Message); }

        finally { socket.Close(); } // 关闭Socket连接并清理资源。

    }

}

 

推荐方法:使用BinaryWriterMemoryStream配合BitConverter(对于跨平台兼容性) 如果你关心跨平台兼容性,建议使用BitConverter来手动转换数据类型到字节数组,然后再发送:

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text; // 对于可能的字符串操作(可选)

using System.Runtime.InteropServices; // 对于内存布局操作(可选)如果需要跨平台兼容性)

 

class Program { ...... } // 同上,但使用 BitConverter 来转换 double byte[]。例如:byte[] data = BitConverter.GetBytes(numberToSend); socket.Send(data); 而不是使用 BinaryWriter。这样可以避免对二进制格式的依赖。注意,这种方法不需要额外的流包装。直接将字节数组发送即可。这样可以保持代码的简洁性和跨平台兼容

版权所有 亚拓科技© Copyright 2025 - 2030. All Rights Reserved.
湘ICP备号 技术支持:欣之喔 后台管理
客服
热线电话

13142150073

周一至周五

8:00 - 18:00

在线咨询

点击这里给我发消息