tcp tut gesucht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Gameprogman

Betreff: tcp tut gesucht

BeitragMi, Nov 30, 2005 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi. Kennt wer ein gutes tutorial zu tcp?

Danke im voraus^^
www.bandradr.de ! Awesome !
 

David

BeitragMi, Nov 30, 2005 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

http://de.wikipedia.org/wiki/T...l_Protocol

Hier bitte... Ist zwar bestimmt nicht das was du suchst, aber wer sich sowas von unklar ausdrückt... Rolling Eyes

grüße

x-pressive

BeitragDo, Dez 01, 2005 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider sind ausführlichere Tutorials zum Thema TCP oder UDP was Blitz angeht (noch) Mangelware Sad Hat mich auch gefrustet, als ich mich damit beschäftigt habe. Die Blitz-Online-Hilfe ist in diesem Punkt kaum zu gebrauchen. Es wird dir wohl nichts anderes übrig bleiben, als dich hier im Forum umzugucken und alle möglichen Schnippsel zusammenzutragen. So findest du zwar alles, was du wissen musst -aber eben auf die mühsame Art... Sad Es gibt allerdings schon zahlreiche Threads, in denen die wichtigsten Punkte angesprochen werden.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

CodeMaster

BeitragDo, Dez 01, 2005 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Prinzipiell ist es eigentlich ganz einfach. Ich erkläre mal kurz die Vorgehensweise:

Der Server:
Gestartet wird der Server durch "Stream = CreateTCPServer(Port)". Wenn Stream 0 ist, konnte der Server nicht eingerichtet werden. In der Hauptschleife muss ständig überprüft werden, ob neue Clients zum Server verbinden wollen. Das geschieht mit "ClientStream = AcceptTCPStream(Stream)". Sollte ClientStream nicht 0 sein, beinhaltet es den Stream des neuen Users, welcher in einem Array oder als Type gespeichert werden sollte.
Anschließend muss für jeden gespeicherten User-Stream überprüft werden, ob aus ihm gelesen werden kann. Das geschieht per "While ReadAvail(TmpStream) ... Wend".
Zum Schluss, wenn das Programm beendet werden soll, muss der Server noch geschlossen werden, und zwar per "CloseTCPServer(Stream)".

Der Client:
Der Client muss die IP und den Port des Servers kennen, damit er sich in den Server einloggen kann - und das passiert direkt am Anfang: "Stream = OpenTCPStream(ServerIP$, ServerPort)". Auch hier gilt: Ist Stream 0, konnte aus irgend einem Grund keine Netzwerkverbindung hergestellt werden.
In der Hauptschleife muss nur noch ständig überprüft werden, ob aus dem Stream gelesen werden kann (ist einfacher als beim Server, da der Client ja nur mit dem Server kommuniziert): "While ReadAvail(Stream) ... Wend".
Zum Schluss muss, wie beim Server, die Netzwerkverbindung geschlossen werden durch "CloseTCPStream(Stream)".

Wenn ich Zeit habe, kann ich gleich zwei Beispielprogramme schreiben, die so ziemlich alles Wichtige enthalten.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
 

CodeMaster

BeitragDo, Dez 01, 2005 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab jetzt mal kurz zwei Beispiele programmiert (Server und Client). Bitte erst den Server starten, dann den Client. Zum Senden einer kleinen Nachricht in den jeweiligen Fenstern die Leertaste drücken.

BlitzBasic: [AUSKLAPPEN]
; SERVER

;-- Netzwerkprotokoll ----------

Const cmd_login = 1
Const cmd_login_passed = 2
Const cmd_login_failed = 3
Const cmd_ping = 4
Const cmd_chat = 5
Const cmd_logout = 6

;-- Servereinstellungen --------

Global Port% = 4040
Global Name$ = \"Testserver\"
Global Stream%
Global PingTime% = 1000
Global CurrentPingTime%
Global TimeoutTime% = 10000

;-- Clienteinstellungen --------

Type TClient
Field Stream%
Field Name$
Field IP$
Field Port%
Field Active%
Field Ping%
End Type

;-- Server einrichten ----------

Stream = CreateTCPServer(Port)
If Not Stream Then Color 255,100,100 : Print \"Netzwerkfehler!\" : Delay 1000 : End

Color 100,255,100
Print \"TCP-Server eingerichtet.\"
Print \"Warte auf Clients.\"




;-- Hauptschleife --------------




While Not KeyDown(1)

;-- Server-Runtime -----------
ClientStream = AcceptTCPStream(Stream)
If ClientStream Then
NewClient.TClient = New TClient
NewClient\Stream = ClientStream
NewClient\IP$ = DottedIP(TCPStreamIP(ClientStream))
NewClient\Port = TCPStreamPort(ClientStream)
NewClient\Ping = MilliSecs()
NewClient\Active = False
EndIf
;-- EMPFANGEN ----------------
For TmpClient.TClient = Each TClient
If MilliSecs() - TmpClient\Ping > TimeoutTime Then
;-- TIMEOUT --------------
Color 255,100,100
Print CurrentTime() + \" \" + TmpClient\Name + \" verlässt den Raum (Timeout).\"
Delete TmpClient
Else
If MilliSecs() - CurrentPingTime > PingTime Then
WriteByte TmpClient\Stream, cmd_ping
CurrentPingTime = MilliSecs()
EndIf
While ReadAvail(TmpClient\Stream)
action = ReadByte(TmpClient\Stream)
Select action
Case cmd_ping
TmpClient\Ping = MilliSecs()
Case cmd_login
ClientName$ = ReadString(TmpClient\Stream)
TmpClient\Name = ClientName
TmpClient\Active = True
WriteByte TmpClient\Stream, cmd_login_passed
WriteString TmpClient\Stream, Name$
Color 100,255,100
Print CurrentTime() + \" \" + TmpClient\Name + \" betritt den Raum.\"
Case cmd_chat
Message$ = ReadString(TmpClient\Stream)
Color 100,200,255
Print CurrentTime() + \" \" + TmpClient\Name + \": \" + Message$
Case cmd_logout
Color 255,100,100
Print CurrentTime() + \" \" + TmpClient\Name + \" verlässt den Raum.\"
Delete TmpClient
Exit
End Select
Wend
EndIf
Next
;-- SENDEN -------------------
If KeyHit(57) Then
Message$ = \"Hallo Clients!\"
Color 255,200,100
Print CurrentTime() + \" \" + Name$ + \": \" + Message$
For TmpClient.TClient = Each TClient
WriteByte TmpClient\Stream, cmd_chat
WriteString TmpClient\Stream, Message$
Next
EndIf

Wend

;CloseTCPServer(Stream)

End


BlitzBasic: [AUSKLAPPEN]
; CLIENT

;-- Netzwerkprotokoll ----------

Const cmd_login = 1
Const cmd_login_passed = 2
Const cmd_login_failed = 3
Const cmd_ping = 4
Const cmd_chat = 5
Const cmd_logout = 6

;-- Servereinstellungen --------

Global IP$ = \"127.0.0.1\"
Global port% = 4040
Global ping%
Global TimeoutTime% = 10000
Global ServerName$

;-- Clienteinstellungen --------

Global Name$ = \"Testclient\"
Global Stream%

;-- Verbindung herstellen ------

Stream = OpenTCPStream(IP$,port)
If Not Stream Then Color 255,100,100 : Print \"Netzwerkfehler!\" : Delay 1000 : End

Color 100,255,100
Print \"Verbindung zum Server hergestellt.\"
Print \"Login...\"

;-- Beim Server anmelden -------

WriteByte Stream, cmd_login
WriteString Stream, Name

ping = MilliSecs()
status = 0

While Not status
If ReadAvail(Stream)
action = ReadByte(Stream)
Select action
Case cmd_ping
WriteByte Stream, cmd_ping
ping = MilliSecs()
Case cmd_login_passed
status = 1
ServerName = ReadString(Stream)
Case cmd_login_failed
status = -1
;reason$ = ReadString(Stream) ;z.b. zu viele User, IP gesperrt usw.
End Select
EndIf
Delay 100
Wend

Color 255,100,100
If status = 0 Then Print \"Keine Antwort.\" : Delay 1000 : CloseTCPStream(Stream) : End
If status = -1 Then Print \"Keine Authorisierung.\" : Delay 1000 : CloseTCPStream(Stream) : End

Color 100,255,100
Print \"Erfolgreich eingeloggt.\"
ping = MilliSecs()




;-- Hauptschleife --------------




While Not KeyDown(1)

;-- Client-Runtime -----------
If MilliSecs() - ping > TimeoutTime Then
;-- TIMEOUT ----------------
Color 255,100,100
Print \"Timeout des Servers\"
CloseTCPStream(Stream)
Delay 1000
End
Else
;-- EMPFANGEN --------------
While ReadAvail(Stream)
action = ReadByte(Stream)
Select action
Case cmd_ping
ping = MilliSecs()
WriteByte Stream, cmd_ping
Case cmd_chat
Message$ = ReadString(Stream)
Color 100,200,255
Print CurrentTime() + \" \" + ServerName + \": \" + Message$
End Select
Wend
;-- SENDEN -----------------
If KeyHit(57) Then
Message$ = \"Hallo großer Server!\"
Color 255,200,100
Print CurrentTime() + \" \" + Name + \": \" + Message$
WriteByte Stream, cmd_chat
WriteString Stream, Message$
EndIf
EndIf

Wend

WriteByte Stream, cmd_logout

CloseTCPStream(Stream)

End
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

Gameprogman

BeitragDo, Dez 01, 2005 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das könntest du als tutorial ins internet stellen die leute würden dir das aus den Händen reißen.... Wink

Danke, damit bin ich einen entscheidenden schritt weiter^^
www.bandradr.de ! Awesome !
 

CodeMaster

BeitragDo, Dez 01, 2005 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich war vor nem Jahr mal dabei, eine Netzwerklibrary zu schreiben, die sowohl über UDP als auch über TCP senden und empfangen konnte. Der Funktionsreichtum war verhältnismäßig groß (ohne eigentliche Netzwerkfunktionen allein 100kb), außerdem war sie komplett (!!) objektorientiert (nur eine einzige Variable war global) - aber man hätte prinzipiell die komplette Funktionalität der Library auch mit lediglich 4 Befehlen ausnutzen können (Client/Server starten, Daten senden/empfangen).
Habs dann erst mal auf Eis gelegt, da BlitzMax neu erschienen war - inzwischen ist der Code leider unter die Räder gekommen. Allerdings, wenn immer noch entsprechendes Interesse besteht, würde ich mich vielleicht noch mal an die Arbeit machen.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

DA

BeitragDo, Dez 01, 2005 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Habe auch mal im Codearchiv ein Beispiel gepostete.
Ist zwar nen bissl unübersichtlich aber naja. Wink
https://www.blitzforum.de/viewtopic.php?t=9658

Mfg
Deutscher Blitz Basic Chat
 

Weazle25

BeitragFr, Dez 02, 2005 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
CodeMaster hat Folgendes geschrieben:
Allerdings, wenn immer noch entsprechendes Interesse besteht, würde ich mich vielleicht noch mal an die Arbeit machen.


Ein Interesse besteht eigentlich immer da der Multiplayer-Modus bei modernen Spielen immer wichtiger wird.
Und da ich auch keine Ahnung von Internet und Netzwerken hab wäre ich auf jeden Fall an Tutorials und Libs interessiert.


Gruss
Weazle

Christoph

BeitragSo, Nov 19, 2006 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal eine (wahrscheinlich für euch blöd klingende) Frage:

Ich habe ja zwei BB-Programme. Soweit ich das verstanden habe wird eines bei mir, das andere auf dem Server ausgeführt.
Auf meinem Rechner ist das ja kein Problem aber wie lasse ich das 2. Prog auf dem Server laufen?
 

Mr Hopp

BeitragSo, Nov 19, 2006 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du meinst wenn du deinen Code selbst testen willst? Dann lass beide Programme laufen und gebe die IP 127.0.0.1 an (das ist die lokale IP)
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.

BladeRunner

Moderator

BeitragSo, Nov 19, 2006 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Du lässt ein Programm als Server laufen, nicht auf dem Webserver Wink
Ist ein deutlicher Unterschied.
Server bedeutet hier nur dass einer der Rechner die "Führung" übernimmt. Alle anderen im Netzwerk sind dann Clients, die über den Server gesteuert werden.

Was du wohl meintest ist ein Webserver. Den brauchst du aber nicht für dein Multiplayergame.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Christoph

BeitragSo, Nov 19, 2006 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie funktionieren dann Spiele, die man über das Inet spielen kann?

BladeRunner

Moderator

BeitragSo, Nov 19, 2006 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst wiegesagt zwischen mehreren Fällen unterscheiden.

Es gibt Rechner - Internet - Rechner. Das ist das in BB ohne Problem machbare. D.h. Du kannst mit deinem Rechner über Internet mit einem anderen Rechner spielen.

Dann gibt es Webserver- Rechner. Hier liegt wirklich Software auf einem Rechner der auch Homepages speichert und so. Da dies aber normalerweise linux-Rechner sind, fällt hier BB flach. Zudem ist so ein Webserver eine recht teure Angelegenheit, da Du ihn extra anmieten musst (Immerhin stellt er rund um die Uhr ne Breitbandverbindung zur Verfügung).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

CypressArt

Betreff: "Server" - Client

BeitragFr, Feb 23, 2007 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm...das würde bedeuten ich müsste den Serverteil auf einem PC laufen haben, welcher via DSL mit dem INternet verbunden ist, und diese IP müsste bei den clients eingetragen werden?

Oder könnte man den "Server"teil auf den CLient übertragen?
USer A startet das Programm, das Programm überträgt seine IP an nen Webserver (ev. als Textfile mit der IP) und jeder andere User, der das Programm startet, geht zuerst auf diesen Webserver, liest die IP aus dem File und verbindet sich dann auf diese IP, da diese ja als "PseudoServer" dient....hmm wenn sich der User A aber abmeldet, steht die IP ja nicht mehr zur Verfügung und ein anderer User (Vorteilhaft der nächste, also User B) dient als "Server"...da würde sich eine MySql DB anbieten, in welcher jede IP gespeichert wird, wenn das Programm gestartet wird und beim abmelden oder verbindungsunterbuch, ziehen sich die Clients vom Webserver die nächste IP des pseudo Servers....

oder hab ich da was ganz falsch verstanden? Confused Confused
(no comment) -> Google Search Bot!!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group