如何反序列化从网络接收的文件
本文关键字:文件 网络 反序列化 | 更新日期: 2023-09-27 17:58:33
我正在开发一个软件,需要一些帮助。
我有一个客户端和服务器。服务器将序列化文本文件并将其发送到客户端。
我目前的进展:客户端收到二进制数组,但无法将其作为原始文本文件写入光盘。
private void ListenPort()
{
TcpListener _TcpListener= new _TcpListener(7381);
byte[] received_binary= new byte[1024];
_TcpListener.Start();
while (true)
{
Socket Soket = _TcpListener.AcceptSocket();
Soket.Receive(received_binary, received_binary.Length, 0);
}
}
是否需要将其反序列化为字符串?这是我不久前写的一个函数,它可能会有所帮助。。。
public static T BinaryDeserializeObject<T>(byte[] serializedType)
{
if (serializedType == null)
throw new ArgumentNullException("serializedType");
if (serializedType.Length.Equals(0))
throw new ArgumentException("byte array cannot be empty"));
T deserializedObject;
using (MemoryStream memoryStream = new MemoryStream(serializedType))
{
BinaryFormatter deserializer = new BinaryFormatter();
deserializedObject = (T)deserializer.Deserialize(memoryStream);
}
return deserializedObject;
}
主要问题似乎是忽略了receive的返回值。这将返回每次读取的字节数。您应该循环直到这是非正的,每次处理(例如写入FileStream)那么多字节(只是:即使缓冲区更大)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NetworkCommsDotNet;
namespace Client
{
class Program
{
static void Main(string[] args)
{
byte[] bytesToSend = File.ReadAllBytes("testFile.txt");
TCPConnection.GetConnection(new ConnectionInfo("127.0.0.1", 10000)).SendObject("TextFileData", bytesToSend);
Console.WriteLine("Press any key to exit client.");
Console.ReadKey(true);
NetworkComms.Shutdown();
}
}
}
服务器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NetworkCommsDotNet;
namespace Server
{
class Program
{
static void Main(string[] args)
{
NetworkComms.AppendGlobalIncomingPacketHandler<byte[]>("TextFileData", (packetHeader, connection, incomingData) =>
{
Console.WriteLine("Received TextFileData");
File.WriteAllBytes("testFile.txt", incomingData);
});
TCPConnection.StartListening(true);
Console.WriteLine("Server ready. Press any key to shutdown server.");
Console.ReadKey(true);
NetworkComms.Shutdown();
}
}
}
您显然需要从网站下载NetworkCommsDotNet DLL,以便将其添加到"使用NetworkCommsDot Net"引用中。另请参阅客户端示例中的服务器IP地址当前为"127.0.0.1",如果您在同一台机器上运行服务器和客户端,这应该会起作用。有关更多信息,请参阅入门或如何创建客户端-服务器应用程序文章。