Пример взял кусками с Интернета.
Помогите разобраться с этим не могу найти в инете описание Net.Sockets, дайте толчек.
Буду рад на работающию сылку с описание или сылку на эл. Книгу по VB.net.
Надеюсь описал проблему подробно…
Заранее всем спасибо.
Суть программы: запускаем программу создается отдельный поток в которов функция прослушивания порта, это не мешает работе основной программе. Как поступает новый запрос на соединение поток возращает новое соединение выще и мы пработаем с ним.
Public Class Form1
Public Client As Net.Sockets.TcpClient
Public Writer As IO.StreamWriter
Public localAddr As Net.IPAddress = Net.IPAddress.Parse("192.168.0.1") 'IP мой
Public ListenerThread As Threading.Thread
Public Listener As Net.Sockets.TcpListener
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' попытка инициализировать соединение
Dim NewClient As Net.Sockets.TcpClient
Try
NewClient = New Net.Sockets.TcpClient("192.168.0.2", 80)
MsgBox("ЕСТЬ соединения")
Catch e As Net.Sockets.SocketException
End Try
End Sub
Public Sub NewPotoc()
ListenerThread = New Threading.Thread(AddressOf DoListen)
ListenerThread.Start() ' запустить поток с основной функцией DoListen.
End Sub
Private Sub DoListen()
Dim UserConnection As Net.Sockets.TcpClient
Try
Listener = New Net.Sockets.TcpListener(localAddr, 80) 'System.Net.IPAddress.Any
Listener.Start()
' один раз за время исполнения программы: начать прослушивание
MsgBox("Запущен сервер !")
Catch e As Exception
MsgBox("Не запущен сервер !")
End Try
' основной цикл потока.
Do While Not ListenerThread Is Nothing
Try
' AcceptTcpClient ожидает новые соединения и возвращает
' новое соединение, как только оно было установлено.
' UserConnection – обертка для TcpClient.
Dim NewUserConnection As UserConnection = New_ UserConnection(Listener.AcceptTcpClient())
Проблемная строка, как я понимаю тут чтото связано с делегатами о которых я не знаю:
Ошибка Type “UserConnection” is not defind может чтото необьявлено ? Как обьявить?
' Добавить временный обработчик события LineReceived,
' чтобы поймать первое сообщение этого клиента.
AddHandler NewUserConnection, AddressOf ReceiverCallback – Проблемная строка,
NewUserConnection' is not an event of 'WindowsApplication1.Form1 Я понимаю так как это независемый поток (отдельный процесс) там бувают родные, дружественные и.т.д для взаимодействия с друг другом как породнитьт этот поток с приложением или его нужно тоже обьявить? Как? Эта строка возращает данные с прослушенного порта или обькт Net.Sockets.TcpClient? как его дальше обрабатывать? Эта программа была задумана как чат в ней новый пользователь имеет свой Net.Sockets.TcpClient соединение, поток?
Я понимаю, что если взять NewUserConnection т.к. оно содержит соединение, то можно из него вытащить поток или отправить клиенту. Данная программа много поточная и поток прослушивания порта берет на себя создоваемый новый поток, что не мешает работе основной программы. При поступлении пакета или нового соединения поток просыпается и возращает этой строкой данные в подпрограмму ReceiverCallback, Помогите из потока передать данные выше.
MsgBox("Установлено!")
Catch e As Threading.ThreadAbortException
' Это исключение мы ловим по окончании работы потока.
End Try
Loop
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
NewPotoc() 'запуск сервера в отдельном потоке
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Writer = New IO.StreamWriter(Client.GetStream)
Writer.Write(“Текст для отправки”)
' убедиться, что данные будут посланы безотлагательно.
Writer.Flush()
End Sub
Private Sub ReceiverCallback(ByVal ar As IAsyncResult)
Собственно подпрограмма которая получает данные из потока.
Dim BytesRead As Integer
Try
' закончить начатое ранее чтение
BytesRead = Client.GetStream.EndRead(ar)
If BytesRead < 1 Then
Terminate() ' соединение разорвано.
Return ' больше слушать нечего.
End If
'кодировка UTF8 правильно передает русские буквы при работе с потоками
Dim strMessage As String = System.Text.Encoding.UTF8.GetString(ReadBuffer, 0, BytesRead)
' начать новый асинхронный процесс чтения («слушать дальше»)
Client.GetStream.BeginRead(ReadBuffer, 0, BufferSize, AddressOf ReceiverCallback, Nothing)
' уведомить мир о прибытии нового текстового сообщения
RaiseEvent LineReceived(Me, strMessage)
Catch e As Exception
Terminate() ' если что-то пошло не так, закрываем соединение
End Try
End Sub
End Class
Программа работает в сети т.е. на одном компе запускаем программу запускаем поток но вот с другой строкой Dim NewUserConnection As Net.Sockets.TcpClient = Listener.AcceptTcpClient() в потоке, поток запущен и принимает соединение, но не передает в ReceiverCallback т.к AddHandler NewUserConnection, AddressOf ReceiverCallback заремарена из-за ошибки. На другом компе такаяже программа тоже запускаетяс поток проослушивания. Нажимая на кнопку формы с кодом
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' попытка инициализировать соединение
Dim NewClient As Net.Sockets.TcpClient
Try
NewClient = New Net.Sockets.TcpClient("192.168.0.2", 80)
MsgBox("ЕСТЬ соединения")
Catch e As Net.Sockets.SocketException
End Try
End Sub
Соединение проходит.
Ответить
|