1

我正在开发一个需要帮助的软件。

我有一个客户端和服务器。服务器将序列化一个文本文件并将其发送给客户端。

我目前的进展:客户端接收二进制数组但无法将其作为原始文本文件写入光盘。

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);
    }
}
4

3 回答 3

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;
    }
于 2013-02-09T11:16:03.870 回答
0

主要问题似乎是您忽略了接收的返回值。这将返回每次读取的字节数。您应该循环直到这是非正数,每次处理(例如写入 FileStream)那么多字节(仅:即使缓冲区更大)。

于 2013-02-09T11:17:39.860 回答
0

一种可能的解决方案是将文本文件作为一系列字符串或作为字节数组加载并发送。字节数组方法可能是最简洁和有效的,因为它可以在发送期间被压缩,使用网络库 networkcomms.net调用发送的应用程序看起来像这样:

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,以便可以将其添加到“使用 NetworkCommsDotNet”参考中。另请参阅客户端示例中的服务器 IP 地址当前为“127.0.0.1”,如果您在同一台机器上同时运行服务器和客户端,这应该可以工作。有关更多信息,还请查看入门如何创建客户端服务器应用程序文章。

于 2013-02-09T11:30:13.213 回答