TCP Problem bei kleinem Chat

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: TCP Problem bei kleinem Chat

BeitragSa, Okt 01, 2011 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, habe ein Problem mit einem kleinen Chat von TCP.
Da ich ja jetzt langsam anfange mit TCP ist das mein erstes Beispiel.
Naja unten poste ich jetzt Server+Client und mein Problem ist,
dass wenn ich 2 Clients zum Server starte, kann nur noch 1 Client etwas schreiben.. Warum?
Also wenn ich ganz normal den Server starte und dazu paralell den einen Client, funktioniert es fehlerfrei.
Doch wenn ein 2.ter dazu kommt, dann kann nur noch der neu dazu gekommende schreiben und der andere nichts mehr.

Hier die Codes:

Server:
BlitzBasic: [AUSKLAPPEN]

AppTitle "Minecraft MMC - Chat Server"
Graphics 800,600,32,2

Global Server = CreateTCPServer(8000)
Global msg$
If Server <> 0 Then

Print "Der Server wurde gestartet!"
Else
Print "Der Server wurde nicht gestartet!"
WaitKey()
End
End If

While Not KeyHit(1)

Stream = AcceptTCPStream(Server)

If Stream Then

ClientStream = Stream

End If

If ClientStream Then

If ReadAvail(ClientStream) Then

msg$ = ReadLine(ClientStream)
Print msg$

End If

End If

Wend


Client:
BlitzBasic: [AUSKLAPPEN]

AppTitle "Minecraft MMC - Chat Client"
Graphics 800,600,32,2
Global IP$ = Input("IP:> ")
Global JoinServer = OpenTCPStream(IP,8000)
Global Nickname$ = Input("Dein Name:> ")
If JoinServer <> 0 Then

Print "Server beigetreten!"
WriteLine(JoinServer,Nickname$ + "> hat den Chat betreten!")
While Not KeyHit(1)

If ReadAvail(JoinServer) Then

msg$ = ReadLine(JoinServer)

End If

If KeyHit(57) Then

message$ = Input(">")
WriteLine(JoinServer,Nickname$ + "> " + message$)

End If

Wend
WriteLine(JoinServer,Nickname$ + "> hat den Chat verlassen!")
End
Else
Print "Nicht beigetreten!"
WaitKey()
End
End If


Ich hoffe ihr könnt mir helfen
Mit freundlichen Grüßen: GearTechDE

Midimaster

BeitragSa, Okt 01, 2011 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich denke mal, 2 Clients werden wohl auch 2 ClientStream-Objekte beim Server brauchen, oder?

bin da nicht der Fachmann, aber bis sich jemand Wissendes bei Dir meldet kannst du ja diesen Test mal durchführen:

Dein Code + diese Änderungen...
BlitzBasic: [AUSKLAPPEN]
...
Global Server = CreateTCPServer(8000)
Dim ClientStream[9]
Global Member%
....
While Not KeyHit(1)
Stream = AcceptTCPStream(Server)
If Stream Then
ClientStream[Member] = Stream
Member=Member+1
End If

For I=0 To Member
If ClientStream[i] Then
If ReadAvail(ClientStream[i]) Then
msg$ = ReadLine(ClientStream[i])
Print "Member " + i + " sendet: " + msg$
End If
End If
Next
Wend

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Okt 01, 2011 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, ist das so wirklich richtig..
ich warte mal besser noch auf ein paar mehr antworten. xD

aber danke schonmal werd es mal probieren
Mit freundlichen Grüßen: GearTechDE

ozzi789

BeitragMo, Okt 03, 2011 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Jede neuverbundene Instanz in einen Type laden.
Und dann immer alle durchgehen.

Grüsse
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 03, 2011 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey habe das jetzt anders gemacht. falls es jemand wissen will: nen tcp server mit visual basic gemacht und bei dem klappts wunderbar. trotzdem danke.

jedoch habe ich noch eine frage. bei directplay kann man ja diese msgtypes von 1-99 bestimmen. wie mach ich das bei tcp? sodass ich z.b. x oder y koordinate einzeln verschicke und der server dann weiss, was hier was ist??
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 03, 2011 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du verschickst in deinem Protokoll erst z.B. 1 Byte der den Inhalt des folgenden Datenpakets festlegt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 03, 2011 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das verstehe ich nicht ganz, zuerst wird ein byte gesendet und dann meine restlichen daten desendet? könntest du vllt ein kleines beispiel posten?
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 03, 2011 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Du sendest z.B. 1 Byte und 2 Int. Das Byte liest du als erstes aus, mit Select Case wird dann entschieden, das zwei Int ausgelesen werden müssen, und das an diesen Koordinaten etwas passiert.
Was das Byte enthält, denkst du dir selber aus (1=Joinen, 2=Chatnachricht usw.). Am besten benutzt du Konstanten, um die Lesbarkeit zu erhöhen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragMo, Okt 03, 2011 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha oke ich glaube ich habe gelernt... ich probier das morgen mal aus. danke aber schonmal.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMo, Okt 03, 2011 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal ein bisschen 'rumgespielt (da ich TCP & Netzwerk noch nie wirklich benutzt habe).

Server
BlitzBasic: [AUSKLAPPEN]
Graphics(800,600,32,2)
Local FrameTimer = CreateTimer(30)

Global Server = CreateTCPServer(8000)

If Server <> 0 Then
Print "Der Server wurde gestartet!"
Else
Print "Der Server wurde nicht gestartet!"
WaitKey()
End
End If

Local ClientStream, ClientName$, ClientPing, ms
Const TCP_Join=1, TCP_Ping=2, TCP_msg=3

While Not KeyHit(1)

ms = MilliSecs()

If ClientStream Then

If ReadAvail(ClientStream) Then
Select ReadByte(ClientStream)
Case TCP_Join
ClientName$ = ReadString(ClientStream)
WriteByte(ClientStream, TCP_msg)
WriteString(ClientStream, "Willkommen "+ClientName$+"!")
Print(ClientName$+" beigetreten")
Case TCP_Ping
Print(ClientName$+" *Ping*")
ClientPing=ms+30000
Case TCP_msg
Print(ClientName$+": "+ReadString(ClientStream))
End Select
End If

If ClientPing<ms Then
ClientPing=ms+2000
Color(255,0,0)
Print("Verbindung zu "+ClientName$+ " scheint unterbrochen!")
Color(255,255,255)
EndIf

Else
ClientStream = AcceptTCPStream(Server)
ClientPing=ms+30000
End If

WaitTimer(FrameTimer)
Wend

Client
BlitzBasic: [AUSKLAPPEN]
Graphics(800,600,32,2)
Local FrameTimer = CreateTimer(30)

Global IP$ = "127.0.0.1" ;Input("IP:> ")
Global ServerStream = OpenTCPStream(IP,8000)
Global Nickname$ = Input("Dein Name:> ")
FlushKeys()

Const TCP_Join=1, TCP_Ping=2, TCP_msg=3
Const KEY_RETURN=28

Local PingTime%, ms

If ServerStream Then

WriteByte(ServerStream, TCP_Join)
WriteString(ServerStream, Nickname$)

PingTime=MilliSecs()+10000

While Not KeyHit(1)

ms = MilliSecs()

If ReadAvail(ServerStream) Then
Select ReadByte(ServerStream)
Case TCP_msg
Print(ReadString(ServerStream))
End Select
End If

If KeyHit(KEY_RETURN) Then
FlushKeys()
Local msg$ = Input(">")
FlushKeys()
WriteByte(ServerStream, TCP_msg)
WriteString(ServerStream, msg$)
End If

If PingTime < ms Then
PingTime = ms + 10000
WriteByte(ServerStream, TCP_Ping)
EndIf

WaitTimer(FrameTimer)
Wend

End
Else
Print "Nicht beigetreten!"
WaitKey()
End
End If

Ist alles andere als Perfekt. Ist nur für einen Client ausgelegt, der Ping ist kein richtiger Ping usw.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Starwar

BeitragDi, Okt 04, 2011 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres: Deine Variante scheint nicht für mehrere Clients zu funktionieren.
Ich habe es immer so gemacht, dass ich vor Nachrichten einen Zahlencode Stelle, gefolgt von einem Trennzeichen, und dann eine Textnachricht. Das versende ich in einem Rutsch mir WriteLine
Beispiel
Zitat:
"0001>Starwar" -> Starwar joined.
"0003>Hallo" -> Starwar: Hallo
"0004>StarwarX" -> Starwar changed his nick to StarwarX.
"0002>Bye ihr da" -> StarwarX quit (Bye ihr da)

MFG

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Okt 06, 2011 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber ich denke das löst erstmal das Problem, dass ich weiß, wie ich verschiedene sachen versenden kann und später auc benutzen kann xD ^^

ERSTMALS:
Vorher hatte ich das problem ja nicht mehr weil ich mich ja entschieden hatte, einen server mit Visual Basic zu programmieren. Doch ich weiß leider nicht allzu viel in visual basic und bleibe besser im beispiel von Xeres. Danke an dieser Stelle nochmal an dich, du hast mir sehr weiter geholfen denn ich habe jetzt verstanden wie´s geht Very Happy

Aber das andere Problem ist halt mit dem unendlichen joinen von mehreren Users. Dazu würde mir wieder nur das Stichwort Types in den Mund fallen. Vielleicht kann sich hier ja mal jemand melden, der gute erfahrungen mit tcp etc. gemacht hat und weiß wie so etwas geht.
Danke im Voraus

Edit: Habe jetzt noch mal etwas probiert. Es will nur irgendwie nicht.
Könnt ihr mir sagen warum nicht, hab jetzt ca. eine viertel Stunde gesucht aber keinen Fehler gefunden. Was könnte hier dran falsch sein?

Server:
BlitzBasic: [AUSKLAPPEN]

AppTitle "[GearTech] Mausübertragung - Server"
Graphics 400,200,32,2
SetBuffer BackBuffer()
HidePointer()

Include ".\include\Functions.bb"

Global Port% = 8000
Global StreamClient
Global mx#,my#

Const Coord_X = 1
Const Coord_Y = 2

Global Server = CreateTCPServer(Port%)

If Server <> 0 Then

Repeat
Cls

InitMouse()
DrawMouse()
UpdateNetwork()
DrawField()
TextData()

Flip
Until KeyHit(1)
CloseTCPServer Server
End

Else

Color 255,0,0
Print "Der Server konnte nicht gestartet werden!"
Color 255,255,255
WaitKey()
End

End If


Client.bb

BlitzBasic: [AUSKLAPPEN]

AppTitle "[GearTech] Mausübertragung - Client"
Graphics 400,200,32,2
SetBuffer BackBuffer()

Include ".\include\Functions.bb"

Global IP$ = "127.0.0.1"
Global Port% = 8000
Global mx#,my#
Global StreamClient

Const Coord_X = 1
Const Coord_Y = 2

Global Stream = OpenTCPStream(IP$,Port%)

If Stream <> 0 Then

Repeat
Cls

ClientUpdateNetwork()
ClientTextData()
ClientDrawField()
ClientDrawOval()

Flip
Until KeyHit(1)
CloseTCPStream Stream
End

Else

Color 255,0,0
Print "Es konnte keine Verbindung zum Server aufgebaut werden!"
Color 255,255,255
WaitKey()
End

End If


.\include\Functions.bb

BlitzBasic: [AUSKLAPPEN]

;Server
Function TextData()

Color 0,255,0
Text 0,0,"Server gestartet!"
Color 255,255,255

End Function

Function DrawField()

Rect 10,20,380,170,0

End Function

Function InitMouse()

mx# = MouseX()
my# = MouseY()

End Function

Function DrawMouse()

Oval mx#,my#,10,10,1

End Function

Function UpdateNetwork()

StreamClient = AcceptTCPStream(Server)

WriteInt(StreamClient,1)
WriteFloat(StreamClient,mx#)

WriteInt(StreamClient,2)
WriteFloat(StreamClient,my#)

End Function
;Server

;Client

Function ClientTextData()

Color 0,255,0
Text 0,0,"Client verbunden!"
Color 255,255,255

End Function

Function ClientDrawField()

Rect 10,20,380,170,0

End Function

Function ClientDrawOval()

Oval mx#,my#,10,10,1

End Function

Function ClientUpdateNetwork()

If ReadAvail(Stream) Then

Select ReadInt(Stream)

Case Coord_X

mx# = ReadFloat#(Stream)

Case Coord_Y

my# = ReadFloat#(Stream)

End Select

End If

End Function

;Client


So hoffe hier kann mir jemand was drüber erzählen was ich wieder falsch gemacht habe xD
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group