Member 14746412 Ответов: 2

Строка должна разделяться, когда байты(intindex) = 13


https://www.codeproject.com/script/Articles/Download.aspx?file=/KB/cs/488668/TcpServer-src.zip&rp=https://www.codeproject.com/


Я использую это приложение сокета сервера и обнаружил, что оно работает очень хорошо.

Я сталкиваюсь с одним isssue, который заключается в том , что когда клиент непрерывно отправляет длинные строки, то он отображается как разделенные строки в текстовом поле.3/4 строки как один пакет, а другая часть поступает в следующий пакет.

Как я могу решить эту проблему?

Пожалуйста помогите

Что я уже пробовал:

For intIndex = offset To offset + count - 1
           If Bytes(intIndex) = 13 Then
               RaiseEvent LineReceived(Me, mobjText.ToString)
               mobjText = New StringBuilder()
           Else
               mobjText.Append(ChrW(Bytes(intIndex)))
           End If
       Next

Richard Deeming

Если у вас есть вопрос о статье, то разместите его на форуме сообщений в нижней части этой статьи.

Шансы на то, что автор наткнется здесь на этот вопрос и поймет, что это для них, ничтожны.

2 Ответов

Рейтинг:
13

Greg Utas

Я не уверен, что понимаю проблему. Похоже, что код создает новую строку всякий раз, когда он видит "13" (возврат каретки). Но что касается пакетов, TCP ориентирован на поток, что означает, что пакет не должен заканчиваться на границе "сообщения". Пакеты, содержащие клиентские строки, могут быть разделены произвольно. Каждый пакет может содержать часть строки или несколько строк, и это зависит от получателя, чтобы собрать их и разделить их в любых точках, которые имеют смысл, что и делает этот код.


Рейтинг:
1

Member 14746412

Поблагодарить у так много.


Я решил мой вопрос, как показано ниже

<pre>  private void tcpServer1_OnDataAvailable(tcpServer.TcpServerConnection connection)
        {
            byte[] data = readStream(connection.Socket);
            int intIndex;
            int startindex=0;

            for (intIndex = 0; intIndex < data.Length; intIndex++)
            {             

                if (data[intIndex] == 13)
                {
                    if (data != null)
                    {

                        //string splitstring=data.
                        string dataStr = Encoding.ASCII.GetString(data).Substring(startindex,(intIndex-startindex));
                        //dataStr = dataStr + dataStr.Replace("\r", "").Replace("\n", "") + "\r\n";
                        invokeDelegate del = () =>
                        {
                            logData(false, dataStr);
                        };
                        Invoke(del);

                        startindex = intIndex;
                    }
                }
                else
                {
                }
            }          
        }