понедельник, 13 июня 2011 г.

VB.Net. Пересылка данных по локальной сети

Итак, в качестве примера пересылки данных по локальной сети сделаем простейший чат. В нашем случае будем пересылать текст в кодировке Юникод, но в общем случае это может быть любая последовательность байт. Пересылку организуем при помощи классов UdpClient и Socket из пространства имён System.Net.Sockets.

Отправляем данные мы при помощи функции SendTo(b, ep) экземпляра класса Socket, где b — массив байт (наши данные), а ep — конечная точка (экземпляр класса System.Net.IPEndPoint, для инициализации которого нужно знать IP-адрес и порт адресата).

При загрузке формы запускается таймер, в обработчике события Tick которого мы опрашиваем порт нашей машины, на который должны поступить ответные данные, и получаем их при помощи функции Receive(ep) экземпляра класса UdpClient.

IP-адрес 127.0.0.1 — это так называемая петля. Т.е. данные, отправленные на этот адрес, возвращаются нам.

Полный код формы приведён ниже:

Public Class Form1

    Private lport As Integer
    Private udpc As Net.Sockets.UdpClient
    Private soc As Net.Sockets.Socket
    Private sent As Boolean = False

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lport = 9999
        udpc = New Net.Sockets.UdpClient(lport)
        soc = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Dgram, Net.Sockets.ProtocolType.Udp)
        If ComboBox1.Items.Count > 0 Then ComboBox1.SelectedIndex = 0
        TextBox2.Select()
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If udpc.Available > 0 Then
            Dim ep As New Net.IPEndPoint(Net.IPAddress.Any, lport)
            Dim b = udpc.Receive(ep)
            Dim txt = System.Text.Encoding.Unicode.GetString(b)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} from [{1}]:{3}{2}{3}----------------------------{3}", Now, ep.ToString, txt, ControlChars.NewLine)
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If TextBox2.Text.Length > 0 AndAlso ComboBox1.Text.Length > 0 Then
            Dim b = System.Text.Encoding.Unicode.GetBytes(TextBox2.Text)
            Dim ipadr = Net.IPAddress.Parse("127.0.0.1")
            Net.IPAddress.TryParse(ComboBox1.Text, ipadr)
            Dim ep As New Net.IPEndPoint(ipadr, lport)
            soc.SendTo(b, ep)
            TextBox1.Text &= String.Format("{0:HH:mm:ss} Me (to [{1}]):{3}{2}{3}----------------------------{3}", Now, ep.ToString, TextBox2.Text, ControlChars.NewLine)
            TextBox2.Text = ""
            TextBox2.Select()
            If Not ComboBox1.Items.Contains(ComboBox1.Text) Then ComboBox1.Items.Add(ComboBox1.Text)
        End If
    End Sub

    Private Sub TextBox2_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        If e.Control AndAlso e.KeyCode = Keys.Enter Then
            Button1_Click(Nothing, Nothing)
            sent = True
        End If
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        If sent Then
            TextBox2.Text = ""
            sent = False
        End If
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox1.SelectionStart = TextBox1.Text.Length - 1
        TextBox1.SelectionLength = 1
        TextBox1.ScrollToCaret()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Timer1.Stop()
        udpc.Close()
        soc.Close()
    End Sub
End Class

Архив с проектом Visual Studio:

NetTest.zip (105 КБ)

2 комментария:

  1. Спс, попробую написать по вашим наработкам в скором времени чат)

    ОтветитьУдалить
  2. Хорошо!)) Если на C# будете делать, думаю, с переводом проблем не должно возникнуть.))

    ОтветитьУдалить

Го вверх!