На моем сервере есть черная дыра (TcpClient, TcpListener) - PullRequest
4 голосов
/ 29 марта 2010

Я пытаюсь создать сервер, который будет принимать файлы, отправленные клиентами по сети. Если клиент решает отправить по одному файлу за раз, проблем нет, я получаю файл, как ожидал, но если он пытается отправить более одного, я получаю только первый.

Вот код сервера: Я использую один поток для каждого подключенного клиента

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.

Где черная дыра? Могу ли я отправить несколько объектов, как я пытаюсь сделать?

Спасибо за ваше время.

1 Ответ

1 голос
/ 29 марта 2010

Я предполагаю, что если клиенты загружают несколько файлов, ваш цикл читает весь поток как один файл на стороне сервера. Где "разделитель между файлами"? Как сервер узнает, где заканчивается один и начинается другой?

...