Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Net.Sockets.TcpListener Добавлено: 05.03.05 10:09  

Автор вопроса:  Leenoox | ICQ: 163175740 
Пишу тестовую программу клиент-сервер для пересылки текстовых сообщений.

вот сервер:

Dim MyIP1 As Net.IPAddress
Dim message As String
Dim B As String = Nothing
Dim tStream As Net.Sockets.NetworkStream 'Stream
Dim byte1(1024) As [Byte] 'Buffer
MyIP1 = MyIP1.Parse("127.0.0.1")
Dim MyListener As New TcpListener(MyIP1, 21000)

MyListener.Start()
'While True 'в моем случае может быть любое другое условие
Dim CLient As Net.Sockets.TcpClient
CLient = MyListener.AcceptTcpClient() 'вот здесь обычно ждет клиента
tStream = CLient.GetStream()
message = tStream.Read(byte1, 0, byte1.Length)
B = System.Text.Encoding.ASCII.GetString(byte1, 0, message)
RichTextBox1.Text = B
CLient.Close()
'End While
MyListener.Stop()

В таком виде все работает, но пересылается только ОДНО сообщение, после чего, естественно, прием прекращается и надо опять запускать процедуру. Убираю апострофы с /'While/ и с /'End While/, в результате:
RichTextBox1.Text - пустой.
Процедуру зацикливает.

Делаю отладку, вижу, что программа останавливается и ждет на строке
CLient = MyListener.AcceptTcpClient() пока не придет сообщение от клиента, то есть когда произойдет
MyListener.pending = True
Почему тогда процедуру циклит без апострофов?
Подскажите пожалуйста, как сделать так, чтобы процедура всегда была в состоянии приема сообщений от клиента.
Или как описать событие OnMyListener.Pending()= True?
Я новичок в этой области. Наверно, чего-то недопонимаю...
Спасибо.

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 05.03.05 15:10
Я примерно так делаю (вообще, обычно у меня каждый клиент в отдельном
потоке обрабатывается, но здесь для простоты я код переделал для
однопоточного приложения):

        ;Dim TCPListener As New TcpListener(119)
        TCPListener.Start()
        ;Dim socket As TcpClient = TCPListener.AcceptTcpClient()

        ;Do While Not ShouldExit
            Try
                ClientCommand = ReceiveLine()
            Catch nntpex As Exception
                Exit Do
            End Try
            If ClientCommand <> "" Then
                MessageBox.Show ClientCommand
            End If
        Loop

        t.Start()
        TCPListener.Stop()

'...

    Private Function ReceiveLine() As String
        ;Dim stream As NetworkStream = client.GetStream
        ;Dim ms As New IO.MemoryStream()
        ;Dim CR As Boolean
        ;Dim b As Int32
        ;Do
            Try
                b = stream.ReadByte()
            Catch ex As IO.IOException
                If Not ex.InnerException Is Nothing Then
                    If TypeOf ex.InnerException Is SocketException Then
                        Throw New Exception("Ошибка соединения!";)
                    End If
                End If
            End Try
            ms.WriteByte(b)
            If b = -1 Or (CR = True And b = 10) Then
                Exit Do
            ElseIf b = 13 Then
                CR = True
            End If
        Loop
        ;Dim str As String = System.Text.Encoding.Default.GetString(ms.GetBuffer)
        str = str.Substring(0, ms.Length)
        ms.Close()
        str = str.TrimEnd(Convert.ToChar(vbCr), Convert.ToChar(vbLf))
        Return str
    End Function

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам