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

考えられる解決策の 1 つは、テキスト ファイルを一連の文字列またはバイト配列として読み込んで送信することです。バイト配列アプローチは、送信中に圧縮できるため、最も簡潔で効率的かもしれません。ネットワーク ライブラリ 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 を使用する」リファレンスに追加できるように、Web サイトから NetworkCommsDotNet DLL をダウンロードする必要があることは明らかです。また、クライアントの例のサーバー IP アドレスが現在「127.0.0.1」であることも確認してください。これは、サーバーとクライアントの両方を同じマシンで実行する場合に機能するはずです。詳細については、入門またはクライアント サーバー アプリケーションの作成方法に関する記事もご覧ください。

于 2013-02-09T11:30:13.213 に答える