Guten Tag zusammen,
wo fang ich an? Am Besten von vorne.......
Also, ich möchte mir gerne ein eigenes Chat-Programm basteln. Soll folgendermassen aussehen:
Server nimmt Verbindungen, bzw. Nachrichten, an und verteilt diese dann an alle Verbundenen Clients. Da ich noch nicht solange programmiere, funktioniert das ganze nicht so richtig:
Darf ich mal zeigen, was ich bisher habe.....
Public Class Form1
Dim serverstatus As Integer = 0
Dim client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
Dim server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CheckForIllegalCrossThreadCalls = False
ServStatLB.Text = serverstatus
Dim iphost As IPHostEntry = Dns.Resolve(Dns.GetHostName())
IPAdressesCB.Items.AddRange(iphost.AddressList)
IPAdressesCB.Items.Add("127.0.0.1")
IPAdressesCB.SelectedIndex = 0
StartServer.PerformClick()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartServer.Click
Dim ServerIP As IPAddress = IPAddress.Parse(IPAdressesCB.SelectedItem.ToString ())
Dim LocalEndPoint As New IPEndPoint(ServerIP, 26000)
server.Bind(LocalEndPoint)
server.Listen(2)
serverstatus = 1
ServStatLB.Text = serverstatus
StatLB.Text = "Server listening on: " & CType(server.LocalEndPoint, IPEndPoint).Address.ToString() & ":" & CType(server.LocalEndPoint, IPEndPoint).Port.ToString()
AcceptConnectionsBGW.RunWorkerAsync()
End Sub
Private Sub AcceptConnectionsBGW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles AcceptConnectionsBGW.DoWork
Do While serverstatus = 1
client = server.Accept()
Dim port As Int32 = CType(client.RemoteEndPoint, IPEndPoint).Port
Dim tcpip As String = CType(client.RemoteEndPoint, IPEndPoint).Address.ToString()
ConnectedClientsLB.Items.Add(tcpip & ":" & port)
Dim bytes(client.ReceiveBufferSize) As Byte
Dim str As String = Encoding.ASCII.GetString(bytes, 0, client.Receive(bytes))
MsgTB.Text += str & Environment.NewLine
If MessageThreadBGW.IsBusy = False Then
MessageThreadBGW.RunWorkerAsync()
End If
Loop
End Sub
Private Sub StopServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopServer.Click
server.Close()
serverstatus = 0
ServStatLB.Text = serverstatus
StatLB.Text = "Server gestoppt"
End Sub
Private Sub MessageThreadBGW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles MessageThreadBGW.DoWork
Do While serverstatus = 1
Dim bytes(client.ReceiveBufferSize) As Byte
Dim str As String = Encoding.ASCII.GetString(bytes, 0, client.Receive(bytes))
MsgTB.Text += str & Environment.NewLine
Loop
End Sub
End Class
Der Servercode ist auch noch nicht ganz fertig, es fehlt noch die Routine um die erhaltenen Nachrichten weiterzuleiten usw. Aber egal, um das zu machen, muss ich erstmal mein Problem in den Griff kriegen:
Ich starte den Server, er horcht auf Port: 26000, alles wunderbar.
Ich starte den 1. Client und lass ihn zum Server verbinden, klappt wunderbar.
Ich tippe eine Nachricht im 1. Client und schicke diese zum Server, no Problem.
Starte ich den 2. Client und lass ich zum Server verbinden, wird zwar noch die RemoteIP und der RemotePort in der Serveranwendung angezeigt, aber die 1. Meldung, die der Client beim Connecten absetzen soll, wird beim Server nicht angezeigt.
Will ich im 2. Client eine Nachricht an den Server schicken, taucht die ebenfalls nicht auf.
So, wenn ich aber nun wieder zum 1. Client wechsle und eine Nachricht an den Server schicke, dann läuft plötzlich die 1. Nachricht vom 2. Client, sowie alle auf dem 2. Client getippten Nachrichten, beim Server auf.
Werden diese in einer Warteschlange gepuffert? Und warum dringen die Nachrichten vom 2. Client nicht bis zum Server durch? Irgenwie verstehe ich das ganze nicht so richtig.
Kann es sein, das der Server die beiden Clients nicht unterscheiden kann?
Wäre sehr dankbar, wenn mir jemand von euch einen kleinen Schubs in die Richtige Richtung geben könnte. Würde mir sehr viel Freude machen, das ganze richtig zu verstehen.
Vielen lieben Dank erstmal.
Danny
P.S.: Ich weiss der ganze Code ist noch lange nicht gut, ich bin ja auch erst am Rumprobieren......
wo fang ich an? Am Besten von vorne.......
Also, ich möchte mir gerne ein eigenes Chat-Programm basteln. Soll folgendermassen aussehen:
Server nimmt Verbindungen, bzw. Nachrichten, an und verteilt diese dann an alle Verbundenen Clients. Da ich noch nicht solange programmiere, funktioniert das ganze nicht so richtig:
Darf ich mal zeigen, was ich bisher habe.....
Public Class Form1
Dim serverstatus As Integer = 0
Dim client As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
Dim server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CheckForIllegalCrossThreadCalls = False
ServStatLB.Text = serverstatus
Dim iphost As IPHostEntry = Dns.Resolve(Dns.GetHostName())
IPAdressesCB.Items.AddRange(iphost.AddressList)
IPAdressesCB.Items.Add("127.0.0.1")
IPAdressesCB.SelectedIndex = 0
StartServer.PerformClick()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartServer.Click
Dim ServerIP As IPAddress = IPAddress.Parse(IPAdressesCB.SelectedItem.ToString ())
Dim LocalEndPoint As New IPEndPoint(ServerIP, 26000)
server.Bind(LocalEndPoint)
server.Listen(2)
serverstatus = 1
ServStatLB.Text = serverstatus
StatLB.Text = "Server listening on: " & CType(server.LocalEndPoint, IPEndPoint).Address.ToString() & ":" & CType(server.LocalEndPoint, IPEndPoint).Port.ToString()
AcceptConnectionsBGW.RunWorkerAsync()
End Sub
Private Sub AcceptConnectionsBGW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles AcceptConnectionsBGW.DoWork
Do While serverstatus = 1
client = server.Accept()
Dim port As Int32 = CType(client.RemoteEndPoint, IPEndPoint).Port
Dim tcpip As String = CType(client.RemoteEndPoint, IPEndPoint).Address.ToString()
ConnectedClientsLB.Items.Add(tcpip & ":" & port)
Dim bytes(client.ReceiveBufferSize) As Byte
Dim str As String = Encoding.ASCII.GetString(bytes, 0, client.Receive(bytes))
MsgTB.Text += str & Environment.NewLine
If MessageThreadBGW.IsBusy = False Then
MessageThreadBGW.RunWorkerAsync()
End If
Loop
End Sub
Private Sub StopServer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopServer.Click
server.Close()
serverstatus = 0
ServStatLB.Text = serverstatus
StatLB.Text = "Server gestoppt"
End Sub
Private Sub MessageThreadBGW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles MessageThreadBGW.DoWork
Do While serverstatus = 1
Dim bytes(client.ReceiveBufferSize) As Byte
Dim str As String = Encoding.ASCII.GetString(bytes, 0, client.Receive(bytes))
MsgTB.Text += str & Environment.NewLine
Loop
End Sub
End Class
Der Servercode ist auch noch nicht ganz fertig, es fehlt noch die Routine um die erhaltenen Nachrichten weiterzuleiten usw. Aber egal, um das zu machen, muss ich erstmal mein Problem in den Griff kriegen:
Ich starte den Server, er horcht auf Port: 26000, alles wunderbar.
Ich starte den 1. Client und lass ihn zum Server verbinden, klappt wunderbar.
Ich tippe eine Nachricht im 1. Client und schicke diese zum Server, no Problem.
Starte ich den 2. Client und lass ich zum Server verbinden, wird zwar noch die RemoteIP und der RemotePort in der Serveranwendung angezeigt, aber die 1. Meldung, die der Client beim Connecten absetzen soll, wird beim Server nicht angezeigt.
Will ich im 2. Client eine Nachricht an den Server schicken, taucht die ebenfalls nicht auf.
So, wenn ich aber nun wieder zum 1. Client wechsle und eine Nachricht an den Server schicke, dann läuft plötzlich die 1. Nachricht vom 2. Client, sowie alle auf dem 2. Client getippten Nachrichten, beim Server auf.
Werden diese in einer Warteschlange gepuffert? Und warum dringen die Nachrichten vom 2. Client nicht bis zum Server durch? Irgenwie verstehe ich das ganze nicht so richtig.
Kann es sein, das der Server die beiden Clients nicht unterscheiden kann?
Wäre sehr dankbar, wenn mir jemand von euch einen kleinen Schubs in die Richtige Richtung geben könnte. Würde mir sehr viel Freude machen, das ganze richtig zu verstehen.
Vielen lieben Dank erstmal.
Danny
P.S.: Ich weiss der ganze Code ist noch lange nicht gut, ich bin ja auch erst am Rumprobieren......
Comment