4

ネットワーク経由でクライアントから送信されたファイルを受信するサーバーを構築しようとしています。クライアントが一度に 1 つのファイルを送信することにした場合、問題はありません。期待どおりにファイルを取得しますが、複数のファイルを送信しようとすると、最初のファイルしか取得しません。

サーバーコードは次のとおり です。接続されたクライアントごとに1つのスレッドを使用しています

public void ProcessClients()
{
    while (IsListening)
    {
        ClientHandler clientHandler = new ClientHandler(listener.AcceptTcpClient());
        Thread thread = new Thread(new ThreadStart(clientHandler.Process));
        thread.Start();
    }
}

次のコードは ClientHandler クラスの一部です

public void Process()
{
    while (client.Connected)
    {
        using (MemoryStream memStream = new MemoryStream())
        {
            int read;
            while ((read = client.GetStream().Read(buffer, 0, buffer.Length)) > 0)
            {
                memStream.Write(buffer, 0, read);
            }

            if (memStream.Length > 0)
            {
                Packet receivedPacket = (Packet)Tools.Deserialize(memStream.ToArray());
                File.WriteAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), Guid.NewGuid() + receivedPacket.Filename), receivedPacket.Content);
            }
        }
    }
}

最初の反復で最初のファイルが送信されますが、その後は何も取得されません。私は運がなくても、すべての反復の最後に Thread.Sleep(1000) を使用しようとしました。

反対側には、このコードがあります(クライアント用)

.
.
client.Connect();
foreach (var oneFilename in fileList)
    client.Upload(oneFilename);
client.Disconnect();
.
.

メソッドのアップロード:

public void Upload(string filename)
{
    FileInfo fileInfo = new FileInfo(filename);
    Packet packet = new Packet()
    {
        Filename = fileInfo.Name,
        Content = File.ReadAllBytes(filename)
    };

    byte[] serializedPacket = Tools.Serialize(packet);

    netStream.Write(serializedPacket, 0, serializedPacket.Length);
    netStream.Flush();
}

netStream (NetworkStream) は Connect メソッドで開かれ、Disconnect で閉じられます。

ブラックホールはどこ?やろうとしているように、複数のオブジェクトを送信できますか?

御時間ありがとうございます。

4

1 に答える 1

1

クライアントが複数のファイルをアップロードする場合、ループはサーバー側でストリーム全体を単一のファイルとして読み取っていると推測しています。「ファイル間の区切り文字」はどこにありますか? サーバーは、一方がどこで終わり、もう一方がどこで始まるかをどのように認識しますか?

于 2010-03-29T01:27:00.453 に答える