Ich habe mir ein Chat Client/Server Code abgeschrieben und wenig verändert.
Ich komme irgendwie nicht richtig klar ich will, wenn einer sich anmeldet das die Chatnachricht dick gedruckt ist.
Habe da schon was zusammen aber das geht nicht.. x.x
Dann hab ich noch das Problem das der Chat nicht automatisch runterscrollt das was ich versucht habe geht alles nicht oder es hackt.
Desweiteren is die Onlineanzeige doof. Es geht zwa alles, aber wenn ein Client off geht dann kommt die nachricht das er Off gegangen ist aber er wird nicht aus der Onlineliste gelöscht.
Hier der Code von Client und Server:
Spoiler anzeigen
Server:
Client:
Ich komme irgendwie nicht richtig klar ich will, wenn einer sich anmeldet das die Chatnachricht dick gedruckt ist.
Habe da schon was zusammen aber das geht nicht.. x.x
Dann hab ich noch das Problem das der Chat nicht automatisch runterscrollt das was ich versucht habe geht alles nicht oder es hackt.
Desweiteren is die Onlineanzeige doof. Es geht zwa alles, aber wenn ein Client off geht dann kommt die nachricht das er Off gegangen ist aber er wird nicht aus der Onlineliste gelöscht.
Hier der Code von Client und Server:
Server:
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, 80) ' 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
- Public Sub Userlist()
- Dim users As String = ""
- For Each Connections In list
- users = users & Connections.nick.ToString & ","
- SendToAllClients("/u " & users)
- 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.
- Userlist()
- Console.WriteLine(c.nick & " has joined.")
- SendToAllClients("--> " & "s§" & c.nick & "§" & " hat den Chat verlassen.")
- 'SendToAllClients("--> " & c.nick & " hat den Chat betreten.")
- ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten.
- Dim t As New Threading.Thread(AddressOf ListenToConnection)
- t.Start(c)
- End While
- End Sub
- Private Sub Sendtoperson(ByVal s As String, ByVal Nick As String)
- For Each Connection In list
- Try
- If Connection.nick = Nick Then
- Connection.streamw.WriteLine(s)
- Connection.streamw.Flush()
- End If
- Catch
- End Try
- Next
- 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("S_" + con.nick & ": " & tmp)
- For Each c As Connection In list ' an alle clients weitersenden.
- Try
- c.streamw.WriteLine(con.nick & ": " & tmp)
- c.streamw.Flush()
- Catch
- End Try
- Next
- If tmp.StartsWith("/kick") Then
- Dim Kickname As String = tmp.Remove(0, 6)
- For Each Connection In list
- If Connection.nick = Kickname Then
- SendToAllClients("--> " & Kickname & " wurde gekickt.")
- Sendtoperson("--> " + Kickname + " wurde gekickt.", Kickname)
- Console.WriteLine(Kickname & " has kicked!")
- list.Remove(Connection)
- Exit For
- End If
- Next
- End If
- Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
- list.Remove(con)
- Console.WriteLine(con.nick & " has exit.")
- SendToAllClients("--> " & "s§" & con.nick & "§" & " hat den Chat verlassen.")
- Exit Do
- End Try
- Loop
- End Sub
- End Module
Client:
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"
- Public Sub AddItem(ByVal s As String)
- Dim chat As String() = s.Split(New Char() {"§"c})
- Select Case chat(0)
- Case "s"
- RichTextBox1.SelectionFont = New Font(RichTextBox1.Font, FontStyle.Bold)
- RichTextBox1.SelectionColor = RichTextBox1.ForeColor
- RichTextBox1.AppendText(chat(1) & ": ")
- RichTextBox1.SelectionFont = New Font(RichTextBox1.Font, FontStyle.Regular)
- RichTextBox1.AppendText(chat(2) & vbCrLf)
- End Select
- Dim userlist As String()
- If s.StartsWith("/u ") Then
- userlist = s.Remove(0, 3).Split(",")
- ListBox2.Items.Clear()
- ListBox2.Items.AddRange(userlist)
- Else
- RichTextBox1.Text = RichTextBox1.Text & s & vbCrLf
- End If
- If s.StartsWith("--> " + nick + " wurde gekickt.") Then
- client.Close()
- stream.Close()
- streamr.Close()
- streamw.Close()
- MsgBox("Du wurdest gekickt.")
- Application.Exit()
- End If
- End Sub
- Private ActiveConnection As Boolean = True
- Private Sub Listen()
- While client.Connected And ActiveConnection
- Try
- Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
- Catch
- If ActiveConnection Then ' Abfrage
- 'MessageBox.Show("Keine Verbindung zum Server." & vbNewLine & "Das Programm wird nun beendet.")
- End If
- CloseConnection()
- End Try
- End While
- End Sub
- Public Sub CloseConnection()
- ActiveConnection = False
- streamw.Close()
- streamr.Close()
- stream.Close()
- client.Close()
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- If TextBox1.Text = "" Then
- Else
- streamw.WriteLine(TextBox1.Text)
- streamw.Flush()
- TextBox1.Clear()
- End If
- End Sub
- Private Sub Form1_leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
- End
- End Sub
- Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
- TextBox1.Text = "/w " + ListBox2.Text
- End Sub
- Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
- Dim IP As String = TextBox4.Text
- Dim PORT As String = TextBox2.Text
- nick = TextBox3.Text
- TextBox1.ReadOnly = False
- TextBox2.ReadOnly = True
- TextBox3.ReadOnly = True
- TextBox4.ReadOnly = True
- Try
- client.Connect(IP, PORT) ' 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()
- Button3.Visible = False
- Button1.Visible = True
- ToolStripStatusLabel1.Text = "Verbunden? Ja."
- 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 Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
- End
- End Sub
- End Class