2014-06-18 2 views
-1

Я разрабатываю одно приложение TCP-сервера с классом прослушивателя TCP. здесь мое серверное приложение получает данные каждую секунду от клиента.Преобразование типа данных прослушивателя TCP

Клиент, отправляющий данные в предопределенном формате. полученные данные содержат 15 сообщений, разделенных символом «\ 0». например, «12 \\ 012.12 \ 0» и т. д. после получения данных i разделить данные и преобразовать их в строковый массив. поэтому у меня есть строковый массив из 15 элементов. после этого каждый элемент преобразуется в конкретный тип данных, и вся запись поступает в базу данных.

сюда данные отправка/получение бывает на каждую секунду. проблема, с которой я сталкиваюсь, - это мое приложение, не отправляющее данные каждую секунду в клиентское приложение.

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

ниже - мой код. если я удалю код преобразования типа данных из функции «MapVariables», он хорошо работает.

Пожалуйста, пожалуйста, может кто-нибудь помочь мне в этом?

private async void ProcessClient(TcpClient tcpClient, CancellationToken ct) 
    { 
     try 
     { 
      while (!ct.IsCancellationRequested) 
      { 
       var stream = tcpClient.GetStream(); 
       var buffer = new byte[bufferSize]; 
       var amountRead = await stream.ReadAsync(buffer, 0, bufferSize); 
       var message = Encoding.ASCII.GetString(buffer, 0, amountRead); 

       string[] dataFromClient = Code.Common.SplitByLength(message, messageSize).ToArray(); 
       dataFromClient = dataFromClient.Select(x => ParseMessage(x)).ToArray(); 

       common.MapVariables(dataFromClient); 

       string serverResponse = string.Join(", ", dataFromClient); 
       //Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
       Byte[] sendBytes = Encoding.ASCII.GetBytes(message); 
       await stream.WriteAsync(sendBytes, 0, sendBytes.Length, ct); 
       stream.Flush(); 
      } 
     } 
     catch (System.IO.IOException ex) 
     { 
      //loge exception 
     } 
     catch (Exception ex) 
     { 
      //loge exception 
     } 
    } 

public void MapVariables(string[] variables) 
    { 
     Variables.Variable1 = int.Parse(variables[0]); 
     Variables.Variable2 = int.Parse(variables[1]); 
     Variables.Variable3 = int.Parse(variables[2]); 
     Variables.Variable4 = int.Parse(variables[3]); 
     Variables.Variable5 = int.Parse(variables[4]); 
     Variables.Variable6 = int.Parse(variables[5]); 
     Variables.Variable7 = int.Parse(variables[6]); 
     Variables.Variable8 = decimal.Parse(variables[7]); 
     Variables.Variable9 = decimal.Parse(variables[8]); 
     Variables.Variable10 = decimal.Parse(variables[9]); 
     Variables.Variable11 = decimal.Parse(variables[10]); 
     Variables.Variable12 = int.Parse(variables[11]); 
     Variables.Variable13 = int.Parse(variables[12]); 
     Variables.Variable14 = decimal.Parse(variables[13]); 
     Variables.Variable15 = decimal.Parse(variables[14]); 

     InsertintoDatabase(); 
    } 
+0

Вы получаете исключения? Вы уверены, что ваша проблема не в 'InsertintoDatabase'? –

+0

Что значит «не закончить вовремя», в чем именно проблема, которую вы испытываете? –

+0

Нет. Я не получаю исключения, но мое приложение не отвечает на запрос клиента в течение секунды. каждый запрос/ответ должен быть завершен за одну секунду. когда я удаляю код преобразования типа данных и просто вставляю значения по умолчанию в базу данных, он работает очень хорошо, но когда я включаю код преобразования типа данных, его иногда получают 2 секунды, и мое сообщение нарушается. я не знаю, но если есть другой лучший способ сделать это, пожалуйста, поделитесь со мной. –

ответ

0

Рассматривая код, вы просто отправляете обратно то, что отправили вам, за исключением запятой.

Вы можете переместить свой MapVariables(...) звонок в отдельную тему и использовать это. Я предполагаю, что ваш звонок InsertintoDatabase является истинным узким местом.

Вы также можете попытаться просто переместить MapVariables(...), чтобы сделать это после того, как вы ответите, так как не похоже, что это повлияет на что-либо, сделав это позже.

+0

Я попробую еще раз, переместив вызов MapVariables (...) в другой поток. InsertintoDatabase - это не настоящая бутылочная шее, потому что я уже расследую ее и не вызываю никакой проблемы. –

Смежные вопросы