Проблема с сервером TCP - PullRequest
       7

Проблема с сервером TCP

0 голосов
/ 30 сентября 2010

Во-первых, я n00b в программировании сокетов. Поэтому я решил написать простые данные через LAN TCP-сервер Мой серверный код, который обрабатывает поступающие данные,

    private void HandleClientComm(object client)
{

    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();
    clientStream.ReadTimeout = 10;
    int size = 4096 * 1000;
    byte[] message = new byte[size];
    byte[] All = new byte[0];
    int bytesRead;
    string error = "";
    lock (this)
    {
        while (true)
        {
            All = new byte[0];
            while (true)
            {
                bytesRead = 0;
                try
                {
                    bytesRead = clientStream.Read(message, 0, size);
                    All = AddBArrays(All, message, bytesRead);
                }
                catch
                {
                    break;
                }

                if (bytesRead == 0)
                {
                    break;
                }

            }
            if (All.Length > 0)
            {
                Message m = (Message)Tools.ByteArrayToObject(All);
                OnRecived(new RecivedArgs("localhost", (Message)Tools.ByteArrayToObject(All)));
            }
        }
        tcpClient.Close();
    }
}
byte[] AddBArrays(byte[] ar1, byte[] ar2, int read)
{
    byte[] concat = new byte[ar1.Length + read];
    if (ar1.Length != 0)
        System.Buffer.BlockCopy(ar1, 0, concat, 0, ar1.Length);
    System.Buffer.BlockCopy(ar2, 0, concat, ar1.Length, read);
    return concat;
}

это работает, но есть некоторые проблемы. Он не принимает файлы размером более 100 МБ или smthng, а также, если я очень часто отправляю данные с интервалом <800, данные теряются. как я должен улучшить свой код? Проблема с большими файлами не так важна, первичная проблема - потеря данных при быстрой отправке данных. tnx за помощь </p>

Хорошо, теперь я обновил код по предложениям

private void HandleClientComm(object client)
{

    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();
    clientStream.ReadTimeout = 10;
    int size = 4096 * 1000;
    List<byte> Test = new List<byte>();
    byte[] message = new byte[size];
    byte[] All = new byte[0];
    int bytesRead;
    while (true)
    {
        //All = new byte[0];
        while (true)
        {
            bytesRead = 0;
            try
            {
                bytesRead = clientStream.Read(message, 0, size);
                for (int i = 0; i < bytesRead; i++)
                {
                    Test.Add(message[i]);
                }
            }
            catch
            {
                break;
            }

            if (bytesRead == 0)
            {
                break;
            }
        }
        if (Test.Count > 0)
        {
            Message m = (Message)Tools.ByteArrayToObject(Test.ToArray());
            OnRecived(new RecivedArgs("localhost", m));
            Test = new List<byte>();
        }
    }
    tcpClient.Close();

}

но проблемы все еще существуют

Редактировать -> проблема с большими файлами исправлена, это было просто «System.OutOfMemoryException», но не выдает ошибку.

Ответы [ 2 ]

0 голосов
/ 01 октября 2010

ОК, я решил проблему.Я просто быстро отправляю много данных, чтобы избежать потери данных.

Мой оптимизированный код:

private void HandleClientComm(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();
    int size = 1;
    byte[] message = new byte[1];
    int bytesRead;
    while (true)
    {
        bytesRead = 0;
        if (clientStream.DataAvailable)
            bytesRead = clientStream.Read(message, 0, 1);
        if (bytesRead > 0)
        {
            OnRecived(new RecivedArgs("tick", null));
        }
        Thread.Sleep(1);
    }
}

Я проверил интервалы всего 1 мс и потери данных нет :) Спасибо заваша помощь

0 голосов
/ 30 сентября 2010
  • Все байтовый массив, который вы должны изменить на List<byte>. Вы создаете случаи как сумасшедшие прямо сейчас. GC, вероятно, работает намного больше, чем нужно. Это может замедлить его настолько, что оно не успевает.

Не относится к сокетам:

  • Сделать размер const
  • НИКОГДА не блокировать this. Создайте приватное поле, которое вы можете заблокировать. На самом деле, я даже не думаю, что вам нужен замок здесь.
  • удалить строку ошибки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...