Du bist nicht angemeldet.

Malischh

Registrierter Benutzer

  • »Malischh« ist männlich
  • »Malischh« ist der Autor dieses Themas

Beiträge: 521

Dabei seit: 10. Dezember 2008

Wohnort: Österreich & Deutschland

Hilfreich-Bewertungen: 13

  • Private Nachricht senden

1

Mittwoch, 25. März 2009, 22:09

Ausführliches TCP und UDP Tutorial

Ausführliches TCP und UDP Tutorial





OK zu allererst ein TCP Client und Server, der eine Verbindung annehmen kann.



Der TCP Client:


Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Imports System.Net.Sockets
Imports System.IO



Public Class Form1


'Variablen:
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader
Dim Client As New TcpClient
Dim IP As String = "192.168.111.17"
Dim Port As Integer = 4000
Dim loginname As String = "abc" ' Diese Variable ist nicht Pflicht! Aber nützlich für ein Chatprogram...
'_________________





Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'Button1 wird geclickt

    Client.Connect(IP, Port)  'Client verbindet sich mit IP: 192.168.111.17 und Port 4000

    If Client.Connected Then

        stream = Client.GetStream ' Stream wird auf Client verwiesen
        streamw = New StreamWriter(stream) ' Stream zum Senden wird deklariert
        streamr = New StreamReader(stream) ' Stream zum Empfangen wird deklariert

        login() ' Sub Login

    Else

        MsgBox("Verbidnung konnte nicht mit " & IP & " aufgebaut werden!")

    End If


End Sub




Sub client_send(ByVal text As String)
    streamw.WriteLine(text)
    streamw.Flush()
End Sub



Function client_recieve() As String
    client_recieve = streamr.ReadLine
End Function




' Nach der erfolgreichen verbindung mit der IP und dem Port wird dieser Sub aufgerufen:
Sub login()
    Try



        'Hier kann man jetzt empfangen wie man will.
        'Auch die reinfolge ist egal.
        'Ich benutzte hier 1 mal senden, einmal empfangen und dann wieder von vorne...
        'Man kann aber auch 2 mal Empfangen und 2 mal Senden nehmen oder...... wies einem so bekommt^^

        client_send("onl " & loginname)

        If client_recieve() = "ok" Then 'Oder sonst irgend was. Ist nur ein Beispiel für einen Login

            Send_irgendwas() ' Hier kann gehts zum nächsten sub um irgend welche Daten zu versenden...

        Else
            'Hier den Code wenn das Anmelden Fehlgeschlagen hat. Goto oder einen Sub aufrufen oder....
            Exit Sub  ' Versteht sich von Selbst...
        End If



    Catch
        ' Hier kann man eine Error Message ausgeben oder eine Automatische Fehlerbehebung machen,....
    End Try

End Sub









Sub Send_irgendwas()

    client_send("Irgendwas")
    If client_recieve() = "Auch wieder irgendwas..." Then
        '.....
    Else
        '....
    End If


    ' Und soo weiter...

    ' Und wenn man die verbidnugn schliesen will, dann einfach:  
    Client.Close()
    ' Nichts einfacher als das!^^

End Sub











End Class







OK jetzt werde ich mal den Code erläutern(Ist anders zum Source Code oben! Hier werden nur die Haupt Sachen erklärt):


Wir brauchen zu aller erst einmal einen Client. Um diesen, benutzen zu können müssen wir ersteinmal die Sockets Klasse importieren. Damit wir auch die Streams benutzen können werden wir die IO Klasse gleich mit importieren:

Visual Basic Quellcode

1
2
Imports System.Net.Sockets
Imports System.IO





Wir erstellen jetzt einen TCP Client und nebenbei auch die Streams zum senden und zum empfangen der Daten:

Visual Basic Quellcode

1
2
3
4
5
   Dim Client As New TcpClient 'Client

   Dim stream As NetworkStream  
   Dim streamw As StreamWriter  'Zum senden
   Dim streamr As StreamReader  'Zum empfangen




OK. Jetzt machen wir einen Sub indem der Client versucht eine Verbindung mit dem Server herzustellen. Wir nehmen mal die IP Addresse "192.168.111.17" und den Port 4000. Danach kommt der Code um zu schauen ob der Client sich erflogreich Verbinden konnte. Wenn ja, wird auf einen nächsten Sub verwiesen. Wenn nein, wird eine MSGBOX ausgeworfen:


Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub Connect_to_Server(byval ip as string, byval port as integer)

Client.Connect(IP, Port)  'Client verbindet sich mit IP: 192.168.111.17 und Port 4000


If Client.Connected Then

        Deklare_Streams() ' Sub Deklare_Streams()

    Else

        MsgBox("Verbidnung konnte nicht mit " & IP & " aufgebaut werden!")

    End If

end sub







So jetzt wird der SUB
Deklare_Streams() aufgerufen. Indem werden die Streams, die wir oben schon deklariert haben, auf den Client verwiesen, damit wir Daten senden und empfangen können:


Visual Basic Quellcode

1
2
3
4
5
6
7
sub Deklare_Streams()

        stream = Client.GetStream                      ' Stream wird auf Client verwiesen
        streamw = New StreamWriter(stream)      ' Stream zum Senden wird deklariert
        streamr = New StreamReader(stream)      ' Stream zum Empfangen wird deklariert

end sub







Jetzt machen wir noch 2 Subs. Einer zum senden der Daten und einen zum Empfangen. Diese bräuchte man nicht unbedingt, da man den Code auch direkt in den Main Sub schreiben könnte. Aber es ist Übersichtlicher:


Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
Sub client_send(ByVal text As String)   ' Sub zum senden der Daten 'text'
    streamw.WriteLine(text)
    streamw.Flush()                          ' Achtung! Flush darf nie vergessen werden, da sonst die Daten nicht gesendet werden.
End Sub



Function client_recieve() As String    ' Sub zum empfangen der Daten.
    client_recieve = streamr.ReadLine
End Function





Jetzt sind wir schon fast am Ende. Jeder kann jetzt daten senden oder empfangen in einer beliebigen Reinfolge. Ich nehmen jetzt 1 mal senden und 1 mal empfangen. Diese werden in dem Button1_click Sub stehen. Also wenn Button1 angeklickt wird, wird ein Stream gesendet und eine Empfangen.


Visual Basic Quellcode

1
2
3
4
5
6
7
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   client_send("HALLO")   ' Dieser Stream geht zum Server.
   
   msgbox (client_recieve())   'Und hier wird der empfangene Stream, der vom Server als Antwort gesendet wurde, in einer MSGBOX ausgegeben.

end sub





Und ganz zum Schluss wenn man die Verbindung trennen will:

Visual Basic Quellcode

1
Client.close



So ich hoffe der Client ist klar. Jetzt muss man nur noch alles für sein Projekt anpassen.












Der Server (Für eine Verbindung):

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Imports System.Net.Sockets
Imports System.IO
Imports System.Net



Public Class Form1



'Variablen:
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader
Dim Server As TcpListener
Dim client As New TcpClient
Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)

Dim mainthread As Threading.Thread
'______________






Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    mainthread = New Threading.Thread(AddressOf mainserver)
    mainthread.Start()

End Sub




Sub mainserver()
    Try

        Server = New TcpListener(ipendpoint)
        Server.Start()

        client = Server.AcceptTcpClient

        stream = client.GetStream
        streamr = New StreamReader(stream)
        streamw = New StreamWriter(stream)  ' Müsste eigentlich alles Klar sein.


        While True

            Select Case streamr.ReadLine

                Case "onl" ' und so weiter eigentlich müsste es heißen select case mid(streamr.readline,1,3) Aber da des ja vielen zu Kompiziert ist lass ich das mal weg^^
                    streamw.WriteLine("ok") ' Achtung! ist nicht Vollständig!
                    streamw.Flush()      ' Code muss angepasst werden.....


                Case "...."  ' ......



                Case "logoff" '........



            End Select

        End While

    Catch
        ' Hier wieder eine Fehler behandlung und ein neuen Versuch den Server zu starten...
    End Try

End Sub





Private Sub Form1__close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
    server.close
Try
        mainthread.Abort()
    Catch
    End Try
End Sub





End Class









Ok. Jetzt erläutere ich auch den Server Code. Zu aller erst einmal den unterschied zwischen diesem Server und einem Multi Server.
Dieser Server kann nur einen Client nach dem anderen vornehmen. Wenn der Client sich eine Stunde mit dem Server Verbindet, kann der nächste Client erst danach angenommen werden. Damit wir auch dieses Problem lösen, werde ich weiter unten den Multi Server erklären.


Zu aller erst müssen wir wieder die IO und die Socket Klasse importieren. Die Net Klasse, inder auch die Socket drinnen ist, importiere ich gleich mit, damit ich die IPendpoint benutzten kann:

Visual Basic Quellcode

1
2
3
Imports System.Net.Sockets
Imports System.IO
Imports System.Net




So jetzt werden wir mal alle unsere Variablen deklarieren:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
   'Variablen:
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader
Dim Server As TcpListener
Dim client As New TcpClient
Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)

Dim mainthread As Threading.Thread
'______________




Jetzt mal langsam^^. Für Diejenigen denen das jetzt zu schnell mit den Variablen ging:


Visual Basic Quellcode

1
2
3
Dim stream As NetworkStream
Dim streamw As StreamWriter
Dim streamr As StreamReader


Das müsste klar sein, da wir das selbe schon oben im Client benutzt haben. Wieder zum empfangen und zum senden benötigen wir diese 3 Streams.


Visual Basic Quellcode

1
Dim Server As TcpListener



Das ist unser Server der nichts anderes tut als eine Clientverbindung anzunehmen.

Wichtig: Der TCPListener kann keine Daten Versenden oder Empfangen!!! Er nimmt nur ausstehende Verbidnungen an! Um jedoch Anworten zu senden oder zu empfangen, benötigen wir einen Client, denn dieser ist zum senden und emfangen da!





Visual Basic Quellcode

1
Dim client As New TcpClient



Wie oben beschrieben benötigen wir diesen Client um den verbundenen Client zu Anworten und deren Streams auch zu empfangen.



Visual Basic Quellcode

1
Dim ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 4000)



Diese Variable ist sowas wie die Addresse wo der der Server listenen soll. '
IPAddress.Any' bedeutet nichts anderes, dass er, egal welche ip, jede Verbidnung annimmt, welche auf dem Port 4000 eintrifft.



Visual Basic Quellcode

1
Dim mainthread As Threading.Thread



Wichitg: In diesem Thread wird der ganze Server laufen. Wenn man den Server ohne Thread macht, dann bleibt die ganze Form bei diesem Code hängen 'Server.AcceptTCPClient'. Also nicht Vergessen, wenn man nicht will, dass seine Form sich Aufhängt^^.





OK. Jetzt werden wir in dem Sub Event 'Form1_load' den Thread 'mainthread' eine Adresse geben und dann starten:


Visual Basic Quellcode

1
2
3
4
5
6
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    mainthread = New Threading.Thread(AddressOf mainserver)
    mainthread.Start()

End Sub







So der Thread startet und führt den Sub
'mainserver' aus. Jetzt erst mal der ganze sub und danach die Erklärung:



Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub mainserver()
    Try

        Server = New TcpListener(ipendpoint)
        Server.Start()

        client = Server.AcceptTcpClient

        stream = client.GetStream
        streamr = New StreamReader(stream)
        streamw = New StreamWriter(stream)  ' Müsste eigentlich alles Klar sein.


        While True

            Select Case streamr.ReadLine

                Case "irgendwas" 
                    streamw.WriteLine("zu irgendwas eine anwort")
                    streamw.Flush()     


                Case "...."  ' ......



                Case "logoff" '........



            End Select

        End While

    Catch
        ' Hier wieder eine Fehler behandlung und ein neuen Versuch den Server zu starten...
    End Try

End Sub






Ojeje: Ihre Nachricht ist zu lang. Es stehen maximal 15 000 Zeichen zur Verfügung.

OK wenn das Forum das so will, folgt der Rest des Tuts unten.^^





Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von »Malischh« (26. März 2009, 12:54)


Es haben bereits 4 registrierte Benutzer diesen Beitrag als hilfreich eingestuft.

Benutzer, die diesen Beitrag hilfreich fanden:

Begleiterkubus, Investmentclub, Yusago, Jopi24

Malischh

Registrierter Benutzer

  • »Malischh« ist männlich
  • »Malischh« ist der Autor dieses Themas

Beiträge: 521

Dabei seit: 10. Dezember 2008

Wohnort: Österreich & Deutschland

Hilfreich-Bewertungen: 13

  • Private Nachricht senden

2

Donnerstag, 26. März 2009, 12:05

2 Teil des Tutorials

Ok und weiter gehts:








Fangen wir mal an und Erklären den ganzen Sub der oben gepostet wurde:




Visual Basic Quellcode

1
Server = New TcpListener(ipendpoint)


Mit diesem Code sagen wir dem Server auf welchem Port er Listenen soll. Wir übergeben ihm unsere IPendpoint, die ich oben schon erklärt haben.


Visual Basic Quellcode

1
Server.Start()



Der Server wird gestartet.




Visual Basic Quellcode

1
client = Server.AcceptTcpClient



So. Hier sieht man, dass der TCPListener nur die Verbindungen annimmt. Sobalt eine Verbindung eingeht, wird diese dem Client übergeben. Dieser ist dann zum senden und empfangen da. Wenn keine Verbindung eingeht, wartet das programm genau hier, bis eine eingeht. Deshalb auch der Thread.


Visual Basic Quellcode

1
2
3
stream = client.GetStream
        streamr = New StreamReader(stream)
        streamw = New StreamWriter(stream)  ' Müsste eigentlich alles Klar sein.



Das müsste doch klar sein? Wieder zum senden/empfangen...


Visual Basic Quellcode

1
While True



Wozu die Schleife? Ganz einfach: Wenn der Server(Zur Rchtigkeit eigentlich jetzt Client) einen Stream empfangen und einen gesendet hat, sollte er doch wieder auf einen Stream warten. Wenn nicht, wird der Code nur einmal augeführt. Das kann wiederum nützlich sein, aber es kommt wie schon gesagt auf das jeweilige Projekt an.



Visual Basic Quellcode

1
Select Case streamr.ReadLine



Ein Stream wird empfangen und wird mit einer Select case aufgewertet.


Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
       Case "irgendwas" 

    streamw.WriteLine("zu irgendwas eine anwort")
                          streamw.Flush()     

......

   end select

end while



Wenn der empfangene Stream "irgendwas" ist, wird "
zu irgendwas eine anwort" zurüch gesendet. oder man kann auch erst einen Code ausfürhenlassen und dann das Egrebnis zurück senden,....


Wichtig: Vergesst das .Flush nicht!!!



Man sollte das hier auch nicht Vergessen:


Visual Basic Quellcode

1
2
3
4
5
6
7
   Private Sub Form1__close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
        	Server .Stop
    Try
        mainthread.Abort()
    Catch
    End Try
End Sub




Ich hoffe jetzt, dass der normale Server auch klar.







Damit das Problem mit den 15000 Zeichen nicht nochmal kommt mache ich unten gleich eine neue Antwort, da ich nicht will das ich wie oben mitten in einer Erklärung alles in 2 Spalten muss.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Malischh« (27. März 2009, 15:40)


Es haben bereits 3 registrierte Benutzer diesen Beitrag als hilfreich eingestuft.

Benutzer, die diesen Beitrag hilfreich fanden:

Lexam, simsusim, Xercel

Malischh

Registrierter Benutzer

  • »Malischh« ist männlich
  • »Malischh« ist der Autor dieses Themas

Beiträge: 521

Dabei seit: 10. Dezember 2008

Wohnort: Österreich & Deutschland

Hilfreich-Bewertungen: 13

  • Private Nachricht senden

3

Donnerstag, 26. März 2009, 19:38

TUT 4

Da ich nicht einfach selben Source Code kopieren will, gebe ich euch einfach mal einen Link zu meiner Lieblings WebPage.
Wenn ihr den nicht versteht, fragt nur und ich werde ihn erklären.

Darin ist der rest mit UDP Client/Server und wie man Daten verschickt mithilfe von dem UDP Protokoll.

Meine_Lieblings_HP

So jetzt habe ich euch einen Teil meines Wissens ans Herz gelegt.^^



Hier Beispiele

Achtung die Beispiele sind nicht Komplett!!

Entworfen von Malisch Technology Solutions :thumbup:

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Malischh« (2. August 2009, 00:16)


Malischh

Registrierter Benutzer

  • »Malischh« ist männlich
  • »Malischh« ist der Autor dieses Themas

Beiträge: 521

Dabei seit: 10. Dezember 2008

Wohnort: Österreich & Deutschland

Hilfreich-Bewertungen: 13

  • Private Nachricht senden

4

Samstag, 4. April 2009, 12:13

Das MultiServer Tutorial ist auf der Seite vb-malisch.de im Unterforum "Netzwerk Tutorials, Dlls, Hilfen und vieles mehr..." erhältlich. Es ist nur für Registrierte Benutzer sichtbar!


Enjoy!!!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Malischh« (2. August 2009, 00:17)


progglord

Registrierter Benutzer

  • »progglord« ist männlich

Beiträge: 902

Dabei seit: 10. April 2009

Wohnort: Holzminden

Hilfreich-Bewertungen: 22

  • Private Nachricht senden

5

Dienstag, 17. November 2009, 19:54

hey, ich finde dieses Tutorial klasse, nur funktioniert es bei mir nicht ganz.
Ich habe Server und Client in eine Anwendung gestopft und der User kann Server und/order Client starten.
Das habe ich in 2 Klassen gemacht.
Wenn ich nun den Server starte und den Port 4000 einstelle und dann in der gleichen Anwendung den Clienten mit der IP localhost und dem Port 400 starte. Kann ich Nachrichten senden und empfangen. Da funktioniert es wunderbar.
Nur mein Problem ist. Wenn ich es nun auf anderen Rechnern also Server und Client getrennt habe funktioniert es nciht.
Dann sagt der Connect (also im Debug modus) das er die zeitbeschränkung überschritten hat.
Das habe ich mit mehreren IPs von mir durchprobiert aber es hat nie fuktioniert.

Welche IP muss man denn angeben? Es gibt ja mehrere vorallem wenn man in der cmd ipconfig -all eingibt.

basti2485

Registrierter Benutzer

  • »basti2485« ist männlich

Beiträge: 506

Dabei seit: 18. Januar 2009

Wohnort: Baden bez. [AUT]

Hilfreich-Bewertungen: 2

  • Private Nachricht senden

6

Dienstag, 17. November 2009, 22:52

Naja du wirst mit sehr hoher wahrscheinlichkeit per Router und/oder Sicherheitssoftware wie Kaspersky oderZonealarm ins Internet gehen oder?
LG, basti2485
http://wbas.ath.cx


progglord

Registrierter Benutzer

  • »progglord« ist männlich

Beiträge: 902

Dabei seit: 10. April 2009

Wohnort: Holzminden

Hilfreich-Bewertungen: 22

  • Private Nachricht senden

7

Mittwoch, 18. November 2009, 17:31

per Router ja ;). Hat das irgendwas zu bedeuten?

Mardcore

Registrierter Benutzer

Beiträge: 16

Dabei seit: 26. Oktober 2009

  • Private Nachricht senden

8

Donnerstag, 19. November 2009, 15:00

Dann Starte den Router mal neu. :)

basti2485

Registrierter Benutzer

  • »basti2485« ist männlich

Beiträge: 506

Dabei seit: 18. Januar 2009

Wohnort: Baden bez. [AUT]

Hilfreich-Bewertungen: 2

  • Private Nachricht senden

9

Donnerstag, 19. November 2009, 17:02

per Router ja ;). Hat das irgendwas zu bedeuten?

Ganz einfach:
Dein Router blockiert es. Du musst die Ports auf deinen Rechner "forwarden." Alles nähere hierzu, findest du auf einer, meiner Meinung nach sehr guten Seite: Hier
Da wählst du deinen Router aus, und mit Bildern ist beschrieben, wie du das machst mit dem forwarden der Ports.
Falls du dabei hilfe brauchst, schreib mir ne PN. ;D

LG
Dann Starte den Router mal neu. :)

Also sorry, aber das ist ein gewaltiger Blödsinn.
Naja nicht soo ein Blödsinn. Aber neustarten allein bringt nichts. Also zuerst Ports freigeben, dann Router ggf. neustarten ;D
(danke, kevin89 :D)
LG, basti2485
http://wbas.ath.cx

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »basti2485« (19. November 2009, 17:08)


Vangelis

Registrierter Benutzer

Beiträge: 3

Dabei seit: 22. Juli 2010

  • Private Nachricht senden

10

Donnerstag, 22. Juli 2010, 11:48

While True

Wozu die Schleife? Ganz einfach: Wenn der Server(Zur Rchtigkeit eigentlich jetzt Client) einen Stream empfangen und einen gesendet hat, sollte er doch wieder auf einen Stream warten. Wenn nicht, wird der Code nur einmal augeführt. Das kann wiederum nützlich sein, aber es kommt wie schon gesagt auf das jeweilige Projekt an.

Visual Basic Quellcode




1

Select Case streamr.ReadLine

Ein Stream wird empfangen und wird mit einer Select case aufgewertet.

Visual Basic Quellcode




1
2
3
4
5
6
7
8
9
10

Case "irgendwas"

streamw.WriteLine("zu irgendwas eine anwort")
streamw.Flush()

......

end select

end while

Wenn der empfangene Stream "irgendwas" ist, wird "zu irgendwas eine anwort" zurüch gesendet. oder man kann auch erst einen Code ausfürhenlassen und dann das Egrebnis zurück senden,....

Wichtig: Vergesst das .Flush nicht!!!

Man sollte das hier auch nicht Vergessen:

Visual Basic Quellcode




1
2
3
4
5
6
7

Private Sub Form1__close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
Server .Stop
Try
mainthread.Abort()
Catch
End Try
End Sub
Hallo und guten Tag !
Ich hoffe das Thema ist noch aktuel.
Nach lange Suche habe ich es endlich gefunden, ein "Ausführliches TCP und UDP Tutorial" :-) ! Bin bisher immer nur auf irgendwelche Code-Fragmente, diese meistens auch noch
fehlerhaft und kaum dokumentiert, gestossen.
Da ich, was VB / VB 2008 ein totale Neuling bin (µC programmieren, Assembler, unter DOS mit TurboPascal und so weiter ist ja easy. Aber VB ??? Alles nicht so ganz logisch. Aber vielleicht verwirren auch die viele Objekte, Klasse, Threads und so weiter), hatte ich nun gehofft mit diesem "ausführlichen" Tutorial meine viele Fragen lösen zu können.
Und dann ? Da wo es dann wirklich spanned wird, da steht dann nur "Achtung, ist nicht vollständig, Code muss angepasst werden" :-(
Also wieder nichts, das man nehmen und ausprobieren kann um zu sehen, was wo wie, wieso und weshalb passiert.
Generell ein paar Fragen:
Da gibt eine Schleife "While True ... End While" Aber weclhe Variable(?) wird denn da auf True/False hin geprüft ? Es mag zwar für den Schreiber oder den, der keine Anleitung mehr braucht klar, aber mich verwirrt es sehr, eine Abfrage auf True ohne Angabe was denn True/False sein soll ;-)
Dann "server.close" gibt es das wirklich ? Ich finde in alle Doks nur "server.stop"
Und warum wird Threading benutzt, wenn aber doch nur ein Thread läuft. Oder sind die anderen irgendwo versteckt ?
Fragen über Fragen ...

Vielleicht sollte ich aber einfach mal erklären, was ich machen will. Ist bestimmt so simple, das der eine oder andere sagen wird "Das steht doch da" oder "dafür gibt's doch 1001 Beispiele". Naja, leider ist keines der Beispiel, die gefunden habe wirklich funktionsfähig und da der Verfasser sicher weiss, was er geschrieben hat es er auch nur entsprechend kommentiert.
Also, es geht um folgendes:
Ich möchte ein Progrämmchen schreiben, das Daten, die an einem TCP-Port ankommen mitschreibt.
Im Detail:
Port soll eingegeben werden können
Dann soll das Programm warten, bis Daten ankommen. Diese Daten (reiner Text) kommen z.B. per GPRS (Router mit Portforwarding etc. ist ja kein Thema), somit wird
der PC also als Server arbeiten
Die Daten sollen dann z.B. in einem Textfeld angezeigt werden und bei Bedarf auch in eine Textdatei geschrieben werden können. Neue Daten
werden angehängt (append)
Zunächst nur für eine Client-Server Verbindung, vielleicht später für mehr (10 oder so)
Kann/muss man nun den Port nach einige Sekunden nach dem die Daten angekommen sind wieder schliessen oder kann man ihn einfach offen lassen,
auch für die Version mit mehrere Verbindungen ?
Manche sprehcne von "Port öffnen" andere von "Socket öffnen" etc. Habe noch nicht so ganz verstanden, was der Unterschied sein soll.
So, das ist es eigentlich.
Jetzt aber bitte keine Hinweise wie ich sie hier zu anderen Themen im Forum schon gesehen habe wie" Ist doch ganz einfach. Mach ein Form auf, öffne einen Port, mache einen tcplistener und fertig" Das hilft nicht wirklich weiter ;-)
Ich danke schon für die vielen Hilfe und hoffe ich habe gut erklärt, was ich fragen und wissen will. So gut ist mein Deutsch leider noch nicht.

Vangelis

Gutelaunetyp

Registrierter Benutzer

  • »Gutelaunetyp« ist männlich
  • »Gutelaunetyp« wurde gesperrt

Beiträge: 421

Dabei seit: 26. Dezember 2009

Frühere Benutzernamen: Gutelaunetyp

Hilfreich-Bewertungen: 9

  • Private Nachricht senden

11

Montag, 26. Juli 2010, 11:54

Hay,
ich hab auch einen Router und hab sogar noch ne 2. Firewall und nen Virenprogramm.
Das liegt nicht daran.

Deine Firewall muss dein Programm durchlassen , das ist der Punkt.



Mfg Kevin.

Vangelis

Registrierter Benutzer

Beiträge: 3

Dabei seit: 22. Juli 2010

  • Private Nachricht senden

12

Montag, 26. Juli 2010, 13:23

Hallo Kevin,
ich glaube ich habe doch nicht gut erklärt. Ich habe kein Problem mit Firewall, Routern etc. Das ist alles einfach.
Oder ist Dein Antwort vielleicht nicht für meine Fragen gedacht gewesen ?

Gruss,
Vangelis

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

13

Montag, 26. Juli 2010, 16:16

du musst auf der Server seite das Portforwarding einstellen,...
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Vangelis

Registrierter Benutzer

Beiträge: 3

Dabei seit: 22. Juli 2010

  • Private Nachricht senden

14

Dienstag, 27. Juli 2010, 08:47

Hallo nochmal,
also es geht wirklich nicht um den Router (in dem Portforwarding eingestellt werden muss, nicht in Server), das ist alles gaaaaanz einfach.

Hier nochmal meine Frage, scheint irgendwie nicht richtig rüberzukommen

Zitat

Also, es geht um folgendes:
Ich möchte ein Progrämmchen schreiben, das Daten, die an einem TCP-Port ankommen mitschreibt.
Im Detail:
Port soll eingegeben werden können
Dann soll das Programm warten, bis Daten ankommen. Diese Daten (reiner Text) kommen z.B. per GPRS (Router mit Portforwarding etc. ist ja kein Thema), somit wird
der PC also als Server arbeiten
Die Daten sollen dann z.B. in einem Textfeld angezeigt werden und bei Bedarf auch in eine Textdatei geschrieben werden können. Neue Daten
werden angehängt (append)
Zunächst nur für eine Client-Server Verbindung, vielleicht später für mehr (10 oder so)
Kann/muss man nun den Port nach einige Sekunden nach dem die Daten angekommen sind wieder schliessen oder kann man ihn einfach offen lassen,
auch für die Version mit mehrere Verbindungen ?
Manche sprehcne von "Port öffnen" andere von "Socket öffnen" etc. Habe noch nicht so ganz verstanden, was der Unterschied sein soll.
So, das ist es eigentlich.
Jetzt aber bitte keine Hinweise wie ich sie hier zu anderen Themen im Forum schon gesehen habe wie" Ist doch ganz einfach. Mach ein Form auf, öffne einen Port, mache einen tcplistener und fertig" Das hilft nicht wirklich weiter ;-)
Ich danke schon für die vielen Hilfe und hoffe ich habe gut erklärt, was ich fragen und wissen will. So gut ist mein Deutsch leider noch nicht.


Besten Dank,
Vangelis

Quadsoft.de.vu

Registrierter Benutzer

  • »Quadsoft.de.vu« ist männlich

Beiträge: 196

Dabei seit: 11. Mai 2010

Wohnort: Flensburg

Hilfreich-Bewertungen: 48

  • Private Nachricht senden

15

Dienstag, 27. Juli 2010, 12:28

Zitat von »Malischh«
Wichtig: Vergesst das .Flush nicht!!!


Warum? Laut MSDN hat die Methode gar keine Funktion:

Zitat

Die Flush-Methode implementiert die Stream.Flush-Methode, wirkt sich jedoch nicht auf Netzwerkstreams aus, da der NetworkStream nicht gepuffert ist.Durch Aufrufen der Flush-Methode wird keine Ausnahme ausgelöst.


Quelle:
http://msdn.microsoft.com/de-de/library/…ream.flush.aspx

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

16

Dienstag, 27. Juli 2010, 13:58

wenn AutoFlush = False, dann wird Flush benötigt, ich arbeite zwar normalerweiße mit richtigen Sockets und nicht mit TCPClienten, aber einen Flush benötigt man glaub ich dort schon ;)
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Quadsoft.de.vu

Registrierter Benutzer

  • »Quadsoft.de.vu« ist männlich

Beiträge: 196

Dabei seit: 11. Mai 2010

Wohnort: Flensburg

Hilfreich-Bewertungen: 48

  • Private Nachricht senden

17

Dienstag, 27. Juli 2010, 18:03

Ja, aber nur bei der StreamWriter Klasse. Ich verstehe auch nicht, warum der Threadersteller aus dem Networkstream noch die StreamReader/writer erstellt, da Networkstream auch schon eine Read/Write Methode besitzt.

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

18

Dienstag, 27. Juli 2010, 22:19

da du bei diesem(wie bei jedem anderen Stream auch) zum schreiben einen ByteArray übergeben musst...(zum lesen natürlich ebenfalls...)
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

SONiQ

Registrierter Benutzer

Beiträge: 131

Dabei seit: 8. Januar 2010

  • Private Nachricht senden

19

Dienstag, 3. August 2010, 21:13

Kann mand as auch irgendwie umändern, dass man befehle schicken & empfangen kann von einer IP-Adresse?

jvbsl

Noob

  • »jvbsl« ist männlich

Beiträge: 7 206

Dabei seit: 7. April 2010

Hilfreich-Bewertungen: 397

  • Private Nachricht senden

20

Dienstag, 3. August 2010, 21:55

man kann mit Server sowie Client empfangen und senden(einfach in den Stream schreiben...)
Ich wollte auch mal ne total überflüssige Signatur:
---Leer---

Social Bookmarks