Страница: 1 |
Страница: 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-сайт:
Профиль | | #1
Добавлено: 05.03.05 15:10
Я примерно так делаю (вообще, обычно у меня каждый клиент в отдельном
потоке обрабатывается, но здесь для простоты я код переделал для
однопоточного приложения):
 im TCPListener As New TcpListener(119)
TCPListener.Start()
 im socket As TcpClient = TCPListener.AcceptTcpClient()
 o 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
 im stream As NetworkStream = client.GetStream
 im ms As New IO.MemoryStream()
 im CR As Boolean
 im b As Int32
 o
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
 im 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