Mal ganz was einfaches fürs lokale Netz:
Klasse:
Spoiler anzeigen
Der Empfang ist nicht blockierend -> events
Beachten, dass der Listener auf ALLEN verfügbaren IPs lauscht. Wenn mehr als eine NIC im Rechner ist (auch virtuell etc), kommt jede Nachricht u.U. mehrfach an. Also muss man entweder von .Any auf eine bestimmte umstellen, oder halt irgendwie die doppelten msgs filtern.
Man kann das natürlich nicht nur zum Chatten, sondern auch für alle anderen Kommunitkationen verwenden.
Bsp:
Spoiler anzeigen
Da das ganze via Broadcast funzt, geht es natürlich nicht übers INet!
Klasse:
VB.NET-Quellcode
- Imports System.Threading
- Imports System.Net.Sockets
- Public Class UDPChatter
- Private _Port As Integer
- Private ars As New AutoResetEvent(False)
- Private stoplisten As Boolean
- Event GotMessage(ByVal m As String, ByVal remoteip As Net.IPEndPoint)
- Public Sub New(ByVal port As Integer)
- _Port = port
- End Sub
- Public Sub [Stop]()
- stoplisten = True
- ars.Set()
- End Sub
- Public Sub Listen()
- stoplisten = False
- Dim t As New Thread(AddressOf BackgroundListener)
- t.Start()
- End Sub
- Private Sub ReadCallback(ByVal ar As IAsyncResult)
- Dim u As UdpClient = DirectCast(ar.AsyncState, UdpClient)
- Dim rep As Net.IPEndPoint
- Dim b() As Byte = u.EndReceive(ar, rep)
- If b.Length > 0 Then
- Dim m As String = System.Text.Encoding.Unicode.GetString(b)
- Dim d As [Delegate] = GotMessageEvent
- For Each trg As [Delegate] In d.GetInvocationList
- If TypeOf trg.Target Is Control Then
- DirectCast(trg.Target, Control).Invoke(d, New Object() {m, rep})
- Else
- RaiseEvent GotMessage(m, rep)
- End If
- Next
- End If
- ars.Set()
- End Sub
- Private Sub BackgroundListener()
- Dim p As New Net.IPEndPoint(Net.IPAddress.Any, _Port)
- Dim u As New UdpClient()
- u.EnableBroadcast = True
- u.ExclusiveAddressUse = False
- u.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True)
- u.Client.Bind(p)
- Do
- u.BeginReceive(AddressOf ReadCallback, u)
- ars.Reset()
- ars.WaitOne()
- Loop Until stoplisten
- End Sub
- Public Sub SendStr(ByVal s As String)
- Dim t As New Thread(AddressOf BackgroundSend)
- t.Start(s)
- End Sub
- Private Sub BackgroundSend(ByVal o As Object)
- Dim s As String = DirectCast(o, String)
- Dim p As New Net.IPEndPoint(Net.IPAddress.Broadcast, _Port)
- Dim u As New UdpClient()
- u.ExclusiveAddressUse = False
- u.EnableBroadcast = True
- u.DontFragment = True
- u.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True)
- u.Client.Bind(New Net.IPEndPoint(Net.IPAddress.Any, _Port))
- Dim b() As Byte = System.Text.Encoding.Unicode.GetBytes(s)
- u.Send(b, b.Length, p)
- End Sub
- End Class
Der Empfang ist nicht blockierend -> events
Beachten, dass der Listener auf ALLEN verfügbaren IPs lauscht. Wenn mehr als eine NIC im Rechner ist (auch virtuell etc), kommt jede Nachricht u.U. mehrfach an. Also muss man entweder von .Any auf eine bestimmte umstellen, oder halt irgendwie die doppelten msgs filtern.
Man kann das natürlich nicht nur zum Chatten, sondern auch für alle anderen Kommunitkationen verwenden.
Bsp:
VB.NET-Quellcode
- Public Class Form1
- Private WithEvents c As New UDPChatter(12345)
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- c.Listen()
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- c.SendStr("Hallo")
- End Sub
- Private Sub c_GotMessage(ByVal m As String, ByVal rep As Net.IPEndPoint) Handles c.GotMessage
- ListBox1.Items.Add(m)
- End Sub
- End Class
Da das ganze via Broadcast funzt, geht es natürlich nicht übers INet!