Avatar billede cronck Nybegynder
31. januar 2005 - 12:30 Der 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 ?
Avatar billede arne_v Ekspert
31. januar 2005 - 13:14 #1
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.
Avatar billede cronck Nybegynder
31. januar 2005 - 13:39 #2
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.

Kan du klare dette?
Avatar billede cronck Nybegynder
31. januar 2005 - 13:40 #3
Glemte lige at sige at den skal splitte data'en med "|"...
Avatar billede arne_v Ekspert
31. januar 2005 - 13:42 #4
TcpClient og TcpListener er efter min bedste overbevisning det simpleste.

Split er nemt:

Dim cmds() As String = line.Split("|")
Avatar billede cronck Nybegynder
31. januar 2005 - 13:52 #5
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... :-)
Avatar billede cronck Nybegynder
31. januar 2005 - 13:55 #6
Ville du lave det lille projekt for mig? Så vil jeg nemlig selv bygge videre på det...
Avatar billede arne_v Ekspert
31. januar 2005 - 14:11 #7
Det kan jeg godt - i aften (eller imorgen aften hvis konen har lagt planer
for i aften)
Avatar billede cronck Nybegynder
31. januar 2005 - 14:21 #8
Det er bare i orden... Jeg venter spændt :-)
Avatar billede arne_v Ekspert
31. januar 2005 - 22:48 #9
Imports System
Imports System.Collections
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

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
Avatar billede arne_v Ekspert
31. januar 2005 - 22:48 #10
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
Avatar billede arne_v Ekspert
31. januar 2005 - 22:48 #11
chat server og chat client

du må selv GUI'ficere chat client
Avatar billede cronck Nybegynder
01. februar 2005 - 10:39 #12
Jeg kigger lige på sagerne når at jeg kommer hjem...
Avatar billede cronck Nybegynder
02. februar 2005 - 18:58 #13
Jeg får fejl i serveren...

    Public Sub SendAll(ByVal msg As String)
        For Each ch As ClientHandler In allclients
            ch.Send(msg)
        Next
    End Sub

Name 'ch' is not declared
Og en Syntax error, hvor at den markerer As efter 'ch'
Avatar billede cronck Nybegynder
02. februar 2005 - 21:19 #14
Jeg smutter i seng... Skal tidligt op imorgen...

Har sat 30 point mere på.
Avatar billede arne_v Ekspert
02. februar 2005 - 22:08 #15
Mystisk.

Koden compiler fint hos mig.

Har du kopieret det hele ind i en .vb fil ?
Avatar billede cronck Nybegynder
03. februar 2005 - 06:09 #16
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...?
Avatar billede cronck Nybegynder
03. februar 2005 - 17:12 #17
Jeg tror sq at min version af Visual Studio er lidt out-dated... Den brokker sig sommetider hvis at jeg henter projekter på nettet...

Installerer 2005'eren, og ser om at det virker der...
Avatar billede cronck Nybegynder
03. februar 2005 - 18:28 #18
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 ?
Avatar billede arne_v Ekspert
03. februar 2005 - 20:01 #19
Altså noget event orienteret.

Jeg mener ikke at der er noget indbygget i .NET til det, men det kunne
da relativt nemt laves.
Avatar billede cronck Nybegynder
03. februar 2005 - 20:20 #20
Event orienteret er nok det nemmeste... (Ville jeg mene)
og er også det som at jeg er vant til i VB 6.0...

Hvis at det er event orienteret, kan det så stadig køre multithreads?
Avatar billede cronck Nybegynder
05. februar 2005 - 04:36 #21
Hvordan ser jeg hvor mange klienter der er connected til serveren? og den crasher også når at en klient disconnecter uden at send "EXIT"...
Avatar billede arne_v Ekspert
05. februar 2005 - 21:30 #22
allclients.Count indeholder antal connectede klienter

Du skal nok catche visse exceptions og remove clients.
Avatar billede cronck Nybegynder
07. februar 2005 - 11:50 #23
Hvad mener du? Hvordan fanger jeg disse Exceptions?

Hvis at jeg forstår rigtigt, så er den eneste måde at fange de events på er ved at bruge exceptions?
Avatar billede arne_v Ekspert
07. februar 2005 - 11:55 #24
Du fanger dem med Try Catch.

Jeg ved ikke om det er den eneste. Men den eneste jeg lige kan komme i tanke om.
Avatar billede arne_v Ekspert
25. februar 2005 - 21:04 #25
OK ?
Avatar billede cronck Nybegynder
25. februar 2005 - 21:34 #26
Jeg er gået lidt i stå med vb.net... :-)

Du får bare point'ne
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester