C#通过字节码模拟接收和发送XML数据
写一个客户端和服务器端,分别用于发送和接受xml数据。
参考:https://blog.csdn.net/qq_22120623/article/details/134658839。
客户端
code
using System;
using System.IO;
using System.Net.Sockets;
using System.Xml.Serialization;// 与服务器端使用相同的数据模型
[Serializable]
public class DataMessage
{public int Id { get; set; }public string Content { get; set; }public DateTime Timestamp { get; set; }public bool IsProcessed { get; set; }
}class XmlClient
{private const string ServerIp = "127.0.0.1"; // 服务器IP地址private const int ServerPort = 8888; // 服务器端口private const int BufferSize = 4096;static void Main(string[] args){Console.WriteLine("XML Client started...");TcpClient client = null;try{// 连接到服务器client = new TcpClient(ServerIp, ServerPort);Console.WriteLine($"Connected to server {ServerIp}:{ServerPort}");// 创建要发送的数据DataMessage message = new DataMessage{Id = 1,Content = "这是一条测试消息",Timestamp = DateTime.Now,IsProcessed = false};PrintXML(message); // 打印信息到控制台// 获取网络流using (NetworkStream stream = client.GetStream()){// 将对象序列化为XML并发送XmlSerializer serializer = new XmlSerializer(typeof(DataMessage));using (MemoryStream memoryStream = new MemoryStream()){// 序列化对象到内存流serializer.Serialize(memoryStream, message);byte[] data = memoryStream.ToArray();// 发送数据stream.Write(data, 0, data.Length);Console.WriteLine("Data sent to server:");Console.WriteLine($"Id: {message.Id}");Console.WriteLine($"Content: {message.Content}");}// 等待并接收服务器响应MemoryStream responseStream = new MemoryStream();byte[] buffer = new byte[BufferSize];int bytesRead;while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0){responseStream.Write(buffer, 0, bytesRead);if (stream.DataAvailable == false)break;}// 反序列化响应responseStream.Position = 0;DataMessage response = (DataMessage)serializer.Deserialize(responseStream);Console.WriteLine("\nReceived response from server:");Console.WriteLine($"Id: {response.Id}");Console.WriteLine($"Content: {response.Content}");Console.WriteLine($"Timestamp: {response.Timestamp}");}}catch (Exception ex){Console.WriteLine($"Error: {ex.Message}");}finally{// 关闭客户端连接client?.Close();Console.WriteLine("\nClient disconnected.");}Console.WriteLine("Press any key to exit...");Console.ReadKey();}static void PrintXML(DataMessage dm){// 创建XmlSerializer对象,并指定实体类型XmlSerializer serializer = new XmlSerializer(typeof(DataMessage));// 创建一个StringWriter对象,用于写入XML字符串StringWriter writer = new StringWriter();// 调用Serialize方法将实体类对象转换为XML字符串serializer.Serialize(writer, dm);// 获取XML字符串string xmlString = writer.ToString();// 输出XML字符串Console.WriteLine(xmlString);}
}
输出
XML Client started...
Connected to server 127.0.0.1:8888
<?xml version="1.0" encoding="utf-16"?>
<DataMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Id>1</Id><Content>这是一条测试消息</Content><Timestamp>2025-09-05T13:37:21.2233157+08:00</Timestamp><IsProcessed>false</IsProcessed>
</DataMessage>
Data sent to server:
Id: 1
Content: 这是一条测试消息Received response from server:
Id: 1
Content: Data received successfully
Timestamp: 2025/9/5 13:43:54Client disconnected.
Press any key to exit...
服务器
code
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Xml.Serialization;// 定义要传输的数据模型
[Serializable]
public class DataMessage
{public int Id { get; set; }public string Content { get; set; }public DateTime Timestamp { get; set; }public bool IsProcessed { get; set; }
}class XmlServer
{private const int Port = 8888;private const int BufferSize = 4096;static void Main(string[] args){Console.WriteLine("XML Server started...");Console.WriteLine($"Listening for connections on port {Port}...");// 创建TCP监听器TcpListener server = null;try{// 监听所有网络接口上的指定端口server = new TcpListener(IPAddress.Any, Port);server.Start();while (true){Console.WriteLine("Waiting for a connection...");// 等待客户端连接TcpClient client = server.AcceptTcpClient();Console.WriteLine("Client connected!");// 处理客户端请求HandleClient(client);}}catch (SocketException e){Console.WriteLine($"Socket exception: {e.Message}");}finally{// 停止服务器server?.Stop();Console.WriteLine("Server stopped.");}}private static void HandleClient(TcpClient client){try{// 获取网络流using (NetworkStream stream = client.GetStream()){byte[] buffer = new byte[BufferSize];MemoryStream memoryStream = new MemoryStream();int bytesRead;// 读取所有数据while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0){memoryStream.Write(buffer, 0, bytesRead);// 简单判断:如果客户端发送了结束标记(实际应用中可能需要更复杂的判断)if (stream.DataAvailable == false)break;}// 将接收到的字节反序列化为对象memoryStream.Position = 0; // 重置流位置XmlSerializer serializer = new XmlSerializer(typeof(DataMessage));DataMessage receivedData = (DataMessage)serializer.Deserialize(memoryStream);// 显示接收到的数据Console.WriteLine("\nReceived XML data:");Console.WriteLine($"Id: {receivedData.Id}");Console.WriteLine($"Content: {receivedData.Content}");Console.WriteLine($"Timestamp: {receivedData.Timestamp}");Console.WriteLine($"IsProcessed: {receivedData.IsProcessed}");// 发送响应DataMessage response = new DataMessage{Id = receivedData.Id,Content = "Data received successfully",Timestamp = DateTime.Now,IsProcessed = true};// 序列化响应对象为XML并发送using (MemoryStream responseStream = new MemoryStream()){serializer.Serialize(responseStream, response);byte[] responseBytes = responseStream.ToArray();stream.Write(responseBytes, 0, responseBytes.Length);Console.WriteLine("\nResponse sent to client.");}}}catch (Exception ex){Console.WriteLine($"Error handling client: {ex.Message}");}finally{// 关闭客户端连接client.Close();Console.WriteLine("Client connection closed.\n");}}
}
输出
XML Server started...
Listening for connections on port 8888...
Waiting for a connection...
Client connected!Received XML data:
Id: 1
Content: 这是一条测试消息
Timestamp: 2025/9/5 13:37:21
IsProcessed: FalseResponse sent to client.
Client connection closed.Waiting for a connection...