Hi,
ich habe mal ein einfaches Beispiel - oder eher eine Grundlage - für einen stabilen TCP-MultiServer programmiert, jeder Client bekommt dabei einen eigenen Thread zugewiesen. Hoffentlich lehrreich und ausreichend kommentiert.
Download: MultiServer Sample.7z
Im folgenden der Code noch einmal direkt gepostet.
Der MultiServer (Konsolenanwendung)
Ein einfacher Beispiel-Client (Windows-Forms-Anwendung)
- Eine Listbox für die Auflistung der Nachrichten.
- Eine Textbox für die Nachricht
- Ein Button für's absenden.
Mit dem MultiServer-Code als Vorlage lässt sich schon einiges anstellen. Der Server muss natürlich immer laufen. Viel Spaß dabei, bitte kein reines C&P betreiben sondern den Code ansehen und verstehen (!), bei Fragen antworten.
Den Code bitte ohne Nachfrage nicht anderweitig publizieren.
LG
ich habe mal ein einfaches Beispiel - oder eher eine Grundlage - für einen stabilen TCP-MultiServer programmiert, jeder Client bekommt dabei einen eigenen Thread zugewiesen. Hoffentlich lehrreich und ausreichend kommentiert.
Download: MultiServer Sample.7z
Im folgenden der Code noch einmal direkt gepostet.
Der MultiServer (Konsolenanwendung)
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Imports System.Net
- ' TCP-MultiServer
- ' C 2009 - Vincent Casser
- Module Module1
- Private server As TcpListener
- Private client As New TcpClient
- Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein!
- Private list As New List(Of Connection)
- Private Structure Connection
- Dim stream As NetworkStream
- Dim streamw As StreamWriter
- Dim streamr As StreamReader
- Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
- End Structure
- Private Sub SendToAllClients(ByVal s As String)
- For Each c As Connection In list ' an alle clients weitersenden.
- Try
- c.streamw.WriteLine(s)
- c.streamw.Flush()
- Catch
- End Try
- Next
- End Sub
- Sub Main()
- Console.WriteLine("Der Server läuft!")
- server = New TcpListener(ipendpoint)
- server.Start()
- While True ' wir warten auf eine neue verbindung...
- client = server.AcceptTcpClient
- Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
- c.stream = client.GetStream
- c.streamr = New StreamReader(c.stream)
- c.streamw = New StreamWriter(c.stream)
- c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
- list.Add(c) ' und fügen sie der liste der clients hinzu.
- Console.WriteLine(c.nick & " has joined.")
- ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
- Dim t As New Threading.Thread(AddressOf ListenToConnection)
- t.Start(c)
- End While
- End Sub
- Private Sub ListenToConnection(ByVal con As Connection)
- Do
- Try
- Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird...
- Console.WriteLine(con.nick & ": " & tmp)
- SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden.
- Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
- list.Remove(con)
- Console.WriteLine(con.nick & " has exit.")
- Exit Do
- End Try
- Loop
- End Sub
- End Module
Ein einfacher Beispiel-Client (Windows-Forms-Anwendung)
- Eine Listbox für die Auflistung der Nachrichten.
- Eine Textbox für die Nachricht
- Ein Button für's absenden.
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Public Class Form1
- Private stream As NetworkStream
- Private streamw As StreamWriter
- Private streamr As StreamReader
- Private client As New TcpClient
- Private t As New Threading.Thread(AddressOf Listen)
- Private Delegate Sub DAddItem(ByVal s As String)
- Private nick As String = "unknown"
- Private Sub AddItem(ByVal s As String)
- ListBox1.Items.Add(s)
- End Sub
- Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
- Try
- client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen.
- ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
- If client.Connected Then
- stream = client.GetStream
- streamw = New StreamWriter(stream)
- streamr = New StreamReader(stream)
- streamw.WriteLine(nick) ' das ist optional.
- streamw.Flush()
- t.Start()
- Else
- MessageBox.Show("Verbindung zum Server nicht möglich!")
- Application.Exit()
- End If
- Catch ex As Exception
- MessageBox.Show("Verbindung zum Server nicht möglich!")
- Application.Exit()
- End Try
- End Sub
- Private Sub Listen()
- While client.Connected
- Try
- Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
- Catch
- MessageBox.Show("Verbindung zum Server nicht möglich!")
- Application.Exit()
- End Try
- End While
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- streamw.WriteLine(TextBox1.Text)
- streamw.Flush()
- TextBox1.Clear()
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- nick = InputBox("Nickname: ", "Namen festlegen", "unknown")
- End Sub
- End Class
Mit dem MultiServer-Code als Vorlage lässt sich schon einiges anstellen. Der Server muss natürlich immer laufen. Viel Spaß dabei, bitte kein reines C&P betreiben sondern den Code ansehen und verstehen (!), bei Fragen antworten.
Den Code bitte ohne Nachfrage nicht anderweitig publizieren.
LG
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „kevin89“ ()