Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Потоки и Net.Sockets помогите Добавлено: 10.12.08 17:24  

Автор вопроса:  Artur
Пример взял кусками с Интернета.
Помогите разобраться с этим не могу найти в инете описание 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

Соединение проходит.

Ответить

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

Номер ответа: 1
Автор ответа:
 SHDZ



ICQ: 209382104 

Вопросов: 39
Ответов: 244
 Профиль | | #1 Добавлено: 12.12.08 12:48
поищи книгу "Сетевое программирование для профессионалов" Э. Кровчик и др. - у меня есть но с работы не перешлю - сейчас в связи с кризисом трафик считают

Ответить

Страница: 1 |

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



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