在C#中使用Socket来发送实数(例如double或float类型)时,你需要将实数转换为字节序列,因为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;
// 创建一个MemoryStream和BinaryWriter来写入数据
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连接并清理资源。
}
}
推荐方法:使用BinaryWriter或MemoryStream配合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。这样可以避免对二进制格式的依赖。注意,这种方法不需要额外的流包装。直接将字节数组发送即可。这样可以保持代码的简洁性和跨平台兼容