Hallo liebe Community!
Ich arbeite derzeit an einem TCP Multichat.
Ich habe bisher alles selber gefunden und auch verstanden, aber mir bleiben trotzdem keine Umsatzideen, wie ich zum einen einen einzelnden User vom Chat kicken kann, indem ich einfach den Text "/kick USERNAME" zum Server sende. Zum zweiten versuche ich einen Text nur an einen bestimmten User zu senden, indem man einfach den Text "/USERNAME DERTEXT" zum Server sendet.
Ich habe mir bei der Kickfunktion schon einige Gedanken gemacht, leider klappte das nicht.
Ich habe es so versucht:
Jedoch wird hier dann nur 1 Verbindung angenommen, wenn sich ein 2.ter User zum Chat verbindet wird dieser erst zugelassen wenn der Kickbefehl ausgeführt wurde.
Und bei meiner 2.ten Idee, wo man einen Text zu nur einem Client senden will, habe ich noch keine Ideen und hoffe auch hier auf eure Hilfe.
Der Chatserver Source ist folgender Maßen:
Und der Clientsource lautet so:
Die Grundstrukturen sind von diesen Tutorial: [VB.NET] Multiserver (TCP)?
Mit freundlichem Gruß-
Ich arbeite derzeit an einem TCP Multichat.
Ich habe bisher alles selber gefunden und auch verstanden, aber mir bleiben trotzdem keine Umsatzideen, wie ich zum einen einen einzelnden User vom Chat kicken kann, indem ich einfach den Text "/kick USERNAME" zum Server sende. Zum zweiten versuche ich einen Text nur an einen bestimmten User zu senden, indem man einfach den Text "/USERNAME DERTEXT" zum Server sendet.
Ich habe mir bei der Kickfunktion schon einige Gedanken gemacht, leider klappte das nicht.
Ich habe es so versucht:
Jedoch wird hier dann nur 1 Verbindung angenommen, wenn sich ein 2.ter User zum Chat verbindet wird dieser erst zugelassen wenn der Kickbefehl ausgeführt wurde.
Und bei meiner 2.ten Idee, wo man einen Text zu nur einem Client senden will, habe ich noch keine Ideen und hoffe auch hier auf eure Hilfe.
Der Chatserver Source ist folgender Maßen:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Imports System.Net
- 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.ForegroundColor = ConsoleColor.Green
- Console.WriteLine("Der Chatserver ist Online und bereit für einkommende Verbindungen!")
- Console.ForegroundColor = ConsoleColor.White
- 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.
- Userlist()
- Console.WriteLine("[" & TimeString & "] " & c.nick & " ist dem Chat beigetreten!")
- ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClient
- 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("[" & Date.Now & "] " & con.nick & ": " & tmp)
- SendToAllClients("[" & TimeString & "] " & con.nick & ": " & tmp) ' an alle clients weitersenden.
- Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
- list.Remove(con)
- Console.WriteLine("[" & TimeString & "] " & con.nick & " hat den Chat verlassem!")
- Exit Do
- End Try
- Loop
- End Sub
- Public Sub Userlist()
- Dim users As String = ""
- For Each Connections In list
- users = users & Connections.nick.ToString & ","
- SendToAllClients("/u " & users)
- Next
- End Sub
- End Module
Und der Clientsource lautet so:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Public Class Form6
- 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 = Form1.TextBox1.Text
- Public Sub AddItem(ByVal s As String)
- Dim userlist As String()
- If s.StartsWith("/u ") Then
- userlist = s.Remove(0, 3).Split(",")
- ListBox1.Items.Clear()
- ListBox1.Items.AddRange(userlist)
- Else
- ListBox4.Items.Add(s)
- End If
- End Sub
- Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 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()
- ListBox1.Items.Add(nick)
- Else
- MessageBox.Show("Verbindung zum Server nicht möglich!")
- Me.Close()
- End If
- Catch ex As Exception
- MessageBox.Show("Verbindung zum Server nicht möglich!")
- Me.Close()
- 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!")
- Me.Close()
- 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 Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- End Sub
- End Class
Die Grundstrukturen sind von diesen Tutorial: [VB.NET] Multiserver (TCP)?
Mit freundlichem Gruß-
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dustin“ ()