31. januar 2005 - 12:30Der er
25 kommentarer og 1 løsning
Passiv Forbindelse mellem server/client
Hej Folkens.
Bare sådan for sjov, har jeg tænkt mig at lave en messenger klon. Det som jeg spekulerer mest over, er hvordan at messenger kan connecte til serveren, og du endda kan chatte, selvom at du har firewall? Det må da køre på en passiv forbindelse eller sådan noget... Hvordan gør man dette i VB.Net ?
Og hvordan laver jeg nemmest forbindelse mellem sever/klient ?
Så længe det er client der connecter til server, så skal der kun lukkes op i firewallen foran serveren (fprudsat at firewallen foran client tillader udgående connections, hvilket privat firewalls normalt altid gør).
Og serveren kan jo godt skrive til en connection som er etableret fra client.
Ooook... Så er det jo derfor :-) Du hjalp mig også sidst jeg forsøgte at lave en Server/Client, men jeg kunne ikk rigtig finde ud af det.... Hvordan laver man det aller mest simple forbindelse fra en klient til en server?
Serveren skal være en konsol. Når at serveren modtager data, skal den splitte data'en ind i et array "arrData", og så skal arrData(0) køres igennem "Select Case" som så tjekker hvilken type kommando "arrData(0)" der blev sendt, og derefter behandle data'en. Hvis at kommando'en er "Test" skal den bare skrive arrData(1) i konsollen.
Klienten er en winform, med 2 knapper cmdConnect og cmdSend. Når at der bliver trykket på cmdConnect skal den conneccte til 10.0.0.2, og når at der bliver trykket på send, skulle den gerne sende beskeden "Test|Dav" til serveren.
Splitten en nem, ja... Grunden til at jeg ville have at du satte splitten ind i den anden, var fordi at jeg fandt det ret brugbart i VB 6.0, og jeg er sikker på nemt at kunne overskue hvor at data'en bliver behandlet når at den bliver modtaget... :-)
Class ChatMain Public Shared Sub Main(ByVal args As String()) Dim srv As Server = New Server srv.Run End Sub End Class
Class Server Private allclients As ArrayList
Public Sub Run() allclients = New ArrayList Dim server As TcpListener = New TcpListener(IPAddress.Any, 50000) server.Start While True Dim client As TcpClient = server.AcceptTcpClient Dim ch As ClientHandler = New ClientHandler(client, Me) allclients.Add(ch) Call (New Thread(AddressOf ch.Run)).Start End While End Sub
Public Sub SendAll(ByVal msg As String) For Each ch As ClientHandler In allclients ch.Send(msg) Next End Sub
Public Sub Remove(ByVal ch As ClientHandler) allclients.Remove(ch) End Sub End Class
Class ClientHandler Private rdr As StreamReader Private wrt As StreamWriter Private srv As Server
Public Sub New(ByVal cli As TcpClient, ByVal srv As Server) rdr = New StreamReader(cli.GetStream) wrt = New StreamWriter(cli.GetStream) Me.srv = srv End Sub
Public Sub Run() While True Dim line As String = rdr.ReadLine Dim cmd As String = line.Split(" ".ToCharArray)(0) If cmd = "SEND" Then srv.SendAll(line.Substring(5)) Else If cmd = "EXIT" Then srv.Remove(Me) Return End If End If End While End Sub
Public Sub Send(ByVal msg As String) SyncLock wrt wrt.WriteLine(msg) wrt.Flush End SyncLock End Sub End Class
Imports System Imports System.IO Imports System.Net.Sockets Imports System.Threading
Class ChatClient Public Shared Sub Main(ByVal args As String()) Dim client As TcpClient = New TcpClient("localhost", 50000) Dim wrt As StreamWriter = New StreamWriter(client.GetStream) Call (New Thread(AddressOf (New Reader(client)).Run)).Start Dim line As String line = Console.ReadLine While Not (line Is Nothing) wrt.WriteLine("SEND " + line) wrt.Flush line = Console.ReadLine End While wrt.WriteLine("EXIT") wrt.Flush wrt.Close client.Close End Sub End Class
Class Reader Private rdr As StreamReader
Public Sub New(ByVal cli As TcpClient) rdr = New StreamReader(cli.GetStream) End Sub
Public Sub Run() Try Dim line As String line = rdr.ReadLine While Not (line Is Nothing) Console.WriteLine(line) line = rdr.ReadLine End While Catch e As Exception ' nothing End Try End Sub End Class
Ja, elller.... Jeg opretter en ny Console App. Overskriver al' teksten i den med dette. Forsøger at compile, og den kommer så med fejlen om at sub main ikke kunne findes, der vælger jeg Sub Main igen... Så compiler jeg, og der kommer fejlen...?
Det virkede... Men jeg roder rundt med det her... :-)
Kan man lave koden sådan at der for eks. bliver kaldt nogle sub's eller functions når at der er events som OnClientConnect, OnClientDisconnect, og OnDataArrival ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.