Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Net.Sockets Добавлено: 17.11.05 17:32  

Автор вопроса:  K&M | ICQ: 225442067 
Расскажите плиз, как работать с этим пространством имен, раньше как-то не приходилось, вот и не знаю теперь... В общем расскажите кто может как:
1) Создать сервер
2) Подключить клиент к серверу
3) Передача данных в обе стороны
4) Узнать когда клиент отключился

Ответить

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

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



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

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 17.11.05 18:26
1. Класс TCPListener
2. Класс TCPClient либо Socket
4. Свойства Socket.Connected или TCPClient.Connected

Примеры кода есть в MSDN, .Net Framework SDK и в 101 VB .NET Samples.

Ответить

Номер ответа: 2
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #2 Добавлено: 17.11.05 19:09
Там консольное и в одну сторону.
Вот переписанное под Винду и в обе стороны

Кто мне объяснит другое
Как найти свободный ПОРТ ???

Ну сделал ты Интепроцесс комьюникейшн
а где гарантия что этот порт 13000
свободный будет ? это раз

и если ты и найдёшь свободный порт,
как ты клиента оповестишь, и передашь
ему номер порта ? это два

Подскажите люби добрые ?



Клинт


Imports System.Net.Sockets
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "

    Public Sub New()
        MyBase.New()

        ' Dieser Aufruf ist fьr den Windows Form-Designer erforderlich.
        InitializeComponent()

        ' Initialisierungen nach dem Aufruf InitializeComponent() hinzufьgen

    End Sub

    ' Die Form ьberschreibt den Lцschvorgang der Basisklasse, um Komponenten zu bereinigen.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    ' Fьr Windows Form-Designer erforderlich
    Private components As System.ComponentModel.IContainer

    'HINWEIS: Die folgende Prozedur ist fьr den Windows Form-Designer erforderlich
    'Sie kann mit dem Windows Form-Designer modifiziert werden.
    'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.Label1 = New System.Windows.Forms.Label
        Me.Label2 = New System.Windows.Forms.Label
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(72, 200)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(144, 32)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(80, 24)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(144, 24)
        Me.Label1.TabIndex = 1
        Me.Label1.Text = "Label1"
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(80, 72)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(144, 32)
        Me.Label2.TabIndex = 2
        Me.Label2.Text = "Label2"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Sub Connect(ByVal server As [String], ByVal message As [String];)
        Try
            ' Create a TcpClient.
            ' Note, for this client to work you need to have a TcpServer
            ' connected to the same address as specified by the server, port
            ' combination.
            Dim port As Int32 = 13000
            Dim client As New TcpClient(server, port)

            ' Translate the passed message into ASCII and store it as a Byte array.
            Dim data As [Byte];() = System.Text.Encoding.ASCII.GetBytes(message)

            ' Get a client stream for reading and writing.
            '  Stream stream = client.GetStream();
            Dim stream As NetworkStream = client.GetStream()

            ' Send the message to the connected TcpServer.
            stream.Write(data, 0, data.Length)

            'Console.WriteLine("Sent: {0}", message)

            Label1.Text = "Sent: " + message

            ' Receive the TcpServer.response.
            ' Buffer to store the response bytes.
            data = New [Byte];(256) {}

            ' String to store the response ASCII representation.
            Dim responseData As [String] = [String].Empty

            ' Read the first batch of the TcpServer response bytes.
            Dim bytes As Int32 = stream.Read(data, 0, data.Length)
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)

            'Console.WriteLine("Received: {0}", responseData)
            Label2.Text = "Received:" + responseData

            ' Close everything.
            client.Close()
        Catch e As ArgumentNullException
            Console.WriteLine("ArgumentNullException: {0}", e)
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        End Try

        'Console.WriteLine(ControlChars.Cr + " Press Enter to continue...";)
        'Console.Read()
    End Sub 'Connect

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Connect("127.0.0.1", "Clien hochet Connect";)
    End Sub
End Class
 


и Сревер


Imports System.Net
Imports System.Net.Sockets
Public Class Form1
    Inherits System.Windows.Forms.Form
    Dim port As Int32 = 13000
    Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1";)

    Dim server As New TcpListener(localAddr, port)
#Region " Vom Windows Form Designer generierter Code "

    Public Sub New()
        MyBase.New()

        ' Dieser Aufruf ist fьr den Windows Form-Designer erforderlich.
        InitializeComponent()

        ' Initialisierungen nach dem Aufruf InitializeComponent() hinzufьgen

    End Sub

    ' Die Form ьberschreibt den Lцschvorgang der Basisklasse, um Komponenten zu bereinigen.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    ' Fьr Windows Form-Designer erforderlich
    Private components As System.ComponentModel.IContainer

    'HINWEIS: Die folgende Prozedur ist fьr den Windows Form-Designer erforderlich
    'Sie kann mit dem Windows Form-Designer modifiziert werden.
    'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label
    Friend WithEvents Button2 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.Label1 = New System.Windows.Forms.Label
        Me.Label2 = New System.Windows.Forms.Label
        Me.Label3 = New System.Windows.Forms.Label
        Me.Button2 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(56, 160)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(104, 24)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(40, 24)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(184, 32)
        Me.Label1.TabIndex = 1
        Me.Label1.Text = "Label1"
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(32, 72)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(192, 40)
        Me.Label2.TabIndex = 2
        Me.Label2.Text = "Label2"
        '
        'Label3
        '
        Me.Label3.Location = New System.Drawing.Point(32, 120)
        Me.Label3.Name = "Label3"
        Me.Label3.Size = New System.Drawing.Size(192, 32)
        Me.Label3.TabIndex = 3
        Me.Label3.Text = "Label3"
        '
        'Button2
        '
        Me.Button2.Location = New System.Drawing.Point(56, 200)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(96, 24)
        Me.Button2.TabIndex = 4
        Me.Button2.Text = "Button2"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Controls.Add(Me.Button2)
        Me.Controls.Add(Me.Label3)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            ' Set the TcpListener on port 13000.

            ' Start listening for client requests.
            server.Start()

            ' Buffer for reading data
            Dim bytes(1024) As [Byte]
            Dim data As [String] = Nothing

            ' Enter the listening loop.
            While True
                Label1.Text = "Waiting for a connection... "

                ' Perform a blocking call to accept requests.
                ' You could also user server.AcceptSocket() here.
                Dim client As TcpClient = server.AcceptTcpClient()

                Connect("127.0.0.1", "Clien hochet Connect";)

                Label1.Text = "Connected!"

                data = Nothing

                ' Get a stream object for reading and writing
                Dim stream As NetworkStream = client.GetStream()

                Dim i As Int32

                ' Loop to receive all the data sent by the client.
                i = stream.Read(bytes, 0, bytes.Length)
                While (i <> 0)
                    ' Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
                    Label2.Text = "Received: {0}" + data

                    ' Process the data sent by the client.
                    data = data.ToUpper()
                    data = "Sam pridurok. Otwet ot servera"

                    Dim msg As [Byte];() = System.Text.Encoding.ASCII.GetBytes(data)

                    ' Send back a response.
                    stream.Write(msg, 0, msg.Length)
                    Label3.Text = "Sent: " + data

                    i = stream.Read(bytes, 0, bytes.Length)

                End While

                ' Shutdown and end connection
                client.Close()
            End While
        Catch ex As SocketException
            'Label1.Text = ([String].Format("SocketException: {0}", ex))
        End Try

       
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        server.Stop()
    End Sub

    Sub Connect(ByVal server As [String], ByVal message As [String];)
        Try
            ' Create a TcpClient.
            ' Note, for this client to work you need to have a TcpServer
            ' connected to the same address as specified by the server, port
            ' combination.
            Dim port As Int32 = 13000
            Dim client As New TcpClient(server, port)

            ' Translate the passed message into ASCII and store it as a Byte array.
            Dim data As [Byte];() = System.Text.Encoding.ASCII.GetBytes(message)

            ' Get a client stream for reading and writing.
            '  Stream stream = client.GetStream();
            Dim stream As NetworkStream = client.GetStream()

            ' Send the message to the connected TcpServer.
            stream.Write(data, 0, data.Length)

            'Console.WriteLine("Sent: {0}", message)

            Label1.Text = "Sent: " + message

            ' Receive the TcpServer.response.
            ' Buffer to store the response bytes.
            data = New [Byte];(256) {}

            ' String to store the response ASCII representation.
            Dim responseData As [String] = [String].Empty

            ' Read the first batch of the TcpServer response bytes.
            Dim bytes As Int32 = stream.Read(data, 0, data.Length)
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)

            'Console.WriteLine("Received: {0}", responseData)
            Label2.Text = "Received:" + responseData

            ' Close everything.
            client.Close()
        Catch e As ArgumentNullException
            Console.WriteLine("ArgumentNullException: {0}", e)
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        End Try

        'Console.WriteLine(ControlChars.Cr + " Press Enter to continue...";)
        'Console.Read()
    End Sub 'Connect

    'Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    '   Connect("127.0.0.1", "Clien hochet Connect";)
    'End Sub

End Class

Ответить

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



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

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 17.11.05 19:45
Если в конструктор класса TCPListener передать 0 вместо номера порта, то он откроет свободный порт.
Как его передать клиенту - уже другой вопрос.

Ответить

Номер ответа: 4
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #4 Добавлено: 17.11.05 20:35
Есть вариант
приподключении клиентской части
сразу начинать бомбить все порты в порядке возрастания условным сигналом.
Серверную часть настроить по получении условного сигнала
на отправку номера найденного свободного порта.
/Который надо кстати ещё получить/

Клиент - по получении номера порта "понимает" что работать дальше надо с этим портом.
Но

1. А если кто то перехватит условный сигнал ?
2. Есть микро вероятность случайного приёма номера порта

В общем гайморит получается.

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 18.11.05 11:44
Используй для хендшейкинга майлслоты

Ответить

Номер ответа: 6
Автор ответа:
 K&M



ICQ: 225442067 

Вопросов: 20
Ответов: 170
 Профиль | | #6 Добавлено: 18.11.05 14:50
Спасибо за ответы, тока одну ерунду не знаю, вот функция AcceptTCPClient у TCPClient "вешает комп" пока к ней не подключатся, а как узнать ,когда клиент хочет подключиться и запустить ее именно в этот момент?

Ответить

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



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

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #7
Добавлено: 18.11.05 14:57
Никак. AcceptTCPClient именно начинает ждать подключение клиента к порту. Если ее не вызвать, то порт будет закрыт и клиент соответственно не сможет подключиться, а ты о существовании клиента даже не будешь догадываться.

Чтобы не "вешать" процесс, запускай AcceptTCPClient и вообще всю работу с сокетами в отельном потоке.

Ответить

Номер ответа: 8
Автор ответа:
 K&M



ICQ: 225442067 

Вопросов: 20
Ответов: 170
 Профиль | | #8 Добавлено: 18.11.05 16:01
А я понял.

Метод TCPListener.Start

потом или по ссылке или обычным таймером проверяем св-во TCPListener.Pending, если оно True, то клиент хочет подключиться и мы без проблем вызываем AcceptTCPClient, который тут же срабатывает.

Ответить

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



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

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #9
Добавлено: 18.11.05 16:19
Сорри, спутал Start и Accept*** .

Ответить

Страница: 1 |

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



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