Wieder einmal ein Chat Problem... Jedoch komplizierter!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

ReLeNtLeSS

Betreff: Wieder einmal ein Chat Problem... Jedoch komplizierter!

BeitragMi, Jan 02, 2008 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
HeyHo,

Ich weiß leider nicht mehr weiter... ich hab jetz schon 5 Chats programmiert, und es hat nie hingehauen!
Bei dem hier hab ich mehrere Probleme... Soweit ich das über blicken kann wird ab OpenStream nix mehr geprintet und die nachrichten abschicken geht dann natürlich auch nicht...

Code: [AUSKLAPPEN]

;wieder mal ein chat xD


Graphics 800,600,32,2
Text 0,0,"[H]osten oder [J]oinen?"
WaitKey()

If KeyHit(35) Then ;Hosten

   tcpserver=CreateTCPServer(4511)
      If tcpserver<>0 Then
      Text 0,15,"Host erfolgreich"
      Else
      Text 0,15,"Host konnte nicht aufgebaut werden"
      EndIf
   Repeat
   tcpstream=AcceptTCPStream(tcpserver)
   If tcpstream Then
      Text 0,30,ReadString$(tcpstream)
   EndIf
   Until KeyHit(1)      
      
EndIf   
   
If KeyHit(36) Then ;Joinen

   Text 0,15,"IP: "
   Repeat
      ip_text$=GetKey()
      If ip_text$<>0 Then ip$=ip$+Chr(ip_text$)
      Text 30,15,ip$
   Until KeyHit(28)
   
   openstream=OpenTCPStream(ip$,4511)
   Print ip$
      If openstream<>0 Then
      Text 0,50,"Verbindung erfolgreich!"
      Else
      Text 0,50,"Verbindung fehlgeschlagen!"
      EndIf
      
      WaitKey()
      Cls
      
    Repeat
      texteingabej$=GetKey()
      If texteingabej$<>0 Then textj$=textj$+Chr(texteingabej$)
      Text 0,0,texteingabej$
         If KeyHit(28) Then
            text_darstellen_j=text_darstellen_j+5
            Text 0,text_darstellen_j,texteingabej$
            WriteString openstream,texteingabej$
         EndIf
   Until KeyHit(1)
   
EndIf
 

Dreamora

BeitragMi, Jan 02, 2008 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Obwohl du das gewiss schon einige male gehört hast: Ports < 7000 sind VERBOTEN
Das sind reservierte Ports für vorbestimmte Protokolle und anwendungen. Du hast von 10000 - 64000 alles zur auswahl also wähl bitte da was gescheites. vielleicht hilft das dann weil derzeit könnteste aus reinem dummfug einfach von irgendwas automatisch angenommen oder ewig umgeleitet werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Eingeproggt

BeitragMi, Jan 02, 2008 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir den Code nicht angeschaut, weil ich nur meinen Senf zu den portnummern hinzugeben will:
http://www.iana.org/assignments/port-numbers

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

ReLeNtLeSS

BeitragMi, Jan 02, 2008 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Verbindung klappt jetzt, allerdings werden nur Nullen angezeigt/geschrieben/empfangen?
 

TeDy14

Gast

BeitragMi, Jan 02, 2008 20:53
Antworten mit Zitat
getkey() Hat als rückgabewert ne Zahl ! Du behandelst es aber als wärs nen String...

ReLeNtLeSS

BeitragDo, Jan 03, 2008 2:19
Antworten mit Zitat
Benutzer-Profile anzeigen
gut, stimmt auch wieder, aber trtzdem funktioniert noch nix Confused
 

Dreamora

BeitragDo, Jan 03, 2008 2:20
Antworten mit Zitat
Benutzer-Profile anzeigen
dann frag ma deine software firewall Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragDo, Jan 03, 2008 2:28
Antworten mit Zitat
Benutzer-Profile anzeigen
nene, die verbindung kommt ja zustande, aber es werden nur nullen übertragen...

um genua zu seien sogar nur eine Shocked
 

Dreamora

BeitragDo, Jan 03, 2008 2:41
Antworten mit Zitat
Benutzer-Profile anzeigen
naja was soll auch sonst genau gesandt werden solange dein Code falsch ist. Sofern du auf obigen einwand hin nix geändert hast, wird das so net gehen.
Code: [AUSKLAPPEN]

texteingabej$=GetKey()
      If texteingabej$<>0 Then textj$=textj$+Chr(texteingabej$)
      Text 0,0,texteingabej$
         If KeyHit(28) Then
            text_darstellen_j=text_darstellen_j+5
            Text 0,text_darstellen_j,texteingabej$
            WriteString openstream,texteingabej$
         EndIf



sollte wohl eher heissen:

Code: [AUSKLAPPEN]

texteingabej=GetKey()
      If texteingabej<>0 Then textj$=textj$+Chr(texteingabej)
      Text 0,0,texteingabej
         If KeyHit(28) Then
            text_darstellen_j=text_darstellen_j+5
            Text 0,text_darstellen_j,texteingabej
            WriteString openstream,chr(texteingabej)
         EndIf


das oder ganz oben texteingabej$ = chr(getkey())
und dafür die 2 chr unten nimmer und direkt texteingabej$
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragDo, Jan 03, 2008 2:44
Antworten mit Zitat
Benutzer-Profile anzeigen
danke, immerhin sendet er jetzt keine 0 sondern wirrwarr xD

also da is son komisches problem... er schreibt bei der eingabe die ersten dreibuchstaben hintereinander und dann übbereiander, wenn man enter drückt wird abgeschickt, und man kommt in die nächste zeile, da steht dann ne 0, man schreibt aber oben auf den drei buchstaben weiter Confused
 

Dreamora

BeitragDo, Jan 03, 2008 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun dann solltest du dir vielleicht überlegen was da falsch läuft.

Ein Hinweis: Wenn man enter drückt solls ne neue zeile geben, vorher soll alles in einer zeile gesammelt werden.

Derzeit sammelst du aber nicht in zeilen, verschickst nicht in zeilen und empfängst nicht in zeilen.
Du schickst strings und die haben am schluss immer ne 0

Dein anderes Problem ist das, dass dein Server sich komplett bescheuert verhält um es lieb auszudrücken. Da scheinen dir noch die totallen grundlagen zu fehlen.
Denn prinzipiell würd das so aussehen:

Code: [AUSKLAPPEN]

; In der Funktion die überprüft ob es eine neue Verbindung gab (du willst ja später mehr als nur einen user haben oder? ;-)
someStream = AcceptTcpstream()


; in der Funktion die liest ob etwas angekommen ist
If ReadAvail(someStream)
  Text 0, 0, Readline(someStream)
endif


das als totales basic beispiel.

Da du jetzt schon 5 anläufe gemacht hast und dir das mit den verbindungen schon mindestens 2x gesagt wurde empfehle ich dir den code einfach mal sein zu lassen und dich endlich in die Grundlagen einzulesen bevor du auch nur wieder daran denkst Code für ein Chat System zu schreiben, denn solange du selbst die elementarsten Dinge nicht drin hast wird der Rest niemals funktionieren.
Bei all dem was da drin fehlt (auf anhieb gibts mindestens 4 grundlegende Dinge die verhindern werden dass daraus jemals ein funktionerendes Server - Client Chat System wird) macht es kaum einen sinn mehr als die zwei Dinge oben zu erwähnen und zu hoffen dass du dich diesmal eingehender mit den Dingen beschäftigst als die letzten 5x

Ich würde dir vor allem sehr ans Herz legen das du immerhin die grundlegenden Verhaltensweisen eines Programmierers erlernst nämlich:

1. Überlegen was ein Programm prinzipiell tun soll

2. Überlegen wie es sich in den verschiedenen Nutzungsfällen verhalten soll (Use Cases). In deinem Fall zb: Was soll passieren wenn sich ein neuer User anmeldet (client seite, server seite). Was soll der Client an den Server senden, was der Server an den client?

3. Die dann Fall um Fall implementieren und schauen ob die Implementation auch wirklich das tut was im Fall vorgehen ist, wenn nicht dran arbeiten bis sie es tut.

und dann so deine Programme stück für stück aufbauen.
Solange du zuerst mal spaghetti code hinwurstelst der nix taugt (sorry wenn das hart klingt aber das waren deine chat code versuche) und dann versuchst die zu fixen hast du keine Chance dass das jemals mehr als ein paar hundert zeilen hat weils unmöglich wird danach noch zu überprüfen obs überhaupt noch geht wie es gemäss Fall gehen sollte.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragDo, Jan 03, 2008 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ich versteh schon was du meinst - allerdings baue ich meine ganzen programme natürlich immer so schritt für schritt auf und gucke, was zu tun ist.

bei diesem chat beispiel, wollte ich einfach mal eine übertragung hinkriegen, was ich bei tcp oder udp noch nie geschafft habt...

/Edit: Ich gebs auf... Vom logischen Ablauf müsste es mal wieder alles funktionieren, aber das tut es eben nicht... Diese TCP Dinger sind doch fürn Müll...

SpionAtom

BeitragDo, Jan 03, 2008 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht die Flinte ins Korn werfen, sondern Code rüberwachsen lassen. Exclamation
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

ReLeNtLeSS

BeitragDo, Jan 03, 2008 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
nun gut...
habs mal auskommentiert....

Code: [AUSKLAPPEN]

;wieder mal ein chat xD

Graphics 800,600,32,2
Text 0,0,"[H]osten oder [J]oinen?"
WaitKey()

If KeyHit(35) Then ;Hosten

   tcpserver=CreateTCPServer(55555)
      If tcpserver<>0 Then
      Text 0,15,"Host erfolgreich"
      Else
      Text 0,15,"Host konnte nicht aufgebaut werden"
      EndIf
   Repeat
   tcpstream=AcceptTCPStream(tcpserver)    ;Hier soll er gucken ob eine Verbindung reinkommt. Wenn eine Verbindung komm
   If tcpstream Then                  ;soll er gucken was er readen kann.
   If ReadAvail(tcpstream) Then
      Text 0,30,ReadString$(tcpstream)   ;Ausgeben
   Else
      Print "Nothing"                  ;Als Überprüfung <- Macht er aber nicht!
   EndIf
   EndIf
   Until KeyHit(1)      
      
EndIf   
   
If KeyHit(36) Then ;Joinen

   Text 0,15,"IP: "
   Repeat
      ip_text=GetKey()
      If ip_text<>0 Then ip$=ip$+Chr(ip_text)
      Text 30,15,ip$
   Until KeyHit(28)                     ; Bis hier hin Wunderbar. Klappt alles.
   
   openstream=OpenTCPStream(ip$,55555)
   Print ip$                           ; DAS HIER
      If openstream<>0 Then               ; DAS HIER
      Text 0,50,"Verbindung erfolgreich!"      ; DAS HIER
      Else                           ; DAS HIER  Wird alles nich geprintet. Er will auch den WaitKey() da unten nich haben.
      Text 0,50,"Verbindung fehlgeschlagen!"   ; DAS HIER Er macht sofort schwarzen Bildschirm un printet eine 0
      EndIf                           ; DAS HIER
      
      WaitKey()
      Cls
      
    Repeat
      texteingabej=GetKey()                              ;Genauso aufgebaut wie bei der IP. Bei Enter springt er ja
      If texteingabej<>0 Then textj$=textj$+Chr(texteingabej)      ;auch in eine neue zeile - aber er printet da eine 0 hin
      Text 0,0,texteingabej                              ;und schreibt 3 zahlen bei tastendruck immer ganz oben
         If KeyHit(28) Then                              ;übereinander...
            text_darstellen_j=text_darstellen_j+15
            Text 0,text_darstellen_j,texteingabej
            WriteString openstream,Chr(texteingabej)
         EndIf
   Until KeyHit(1)
   
EndIf
 

Dreamora

BeitragDo, Jan 03, 2008 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If tcpstream Then                  ;soll er gucken was er readen kann.
   If ReadAvail(tcpstream) Then
      Text 0,30,ReadString$(tcpstream)   ;Ausgeben
   Else
      Print "Nothing"                  ;Als Überprüfung <- Macht er aber nicht!
   EndIf


Das hier ist totaller Dummfug sorry.
Deine Kommentare zeigen da recht eindeutig das du eben NICHT verstanden hast wie Streams funktionieren.

Wenn du AcceptTCPStream machst, wird da der erste eintrag drauf stehen gut. Danach liest du das ganze nie wieder aus ...
Ich hatte dir ja oben gesagt, wie rum es strukturiert werden müsste.

Wenn du eine Grundlegende Struktur brauchst so hats, wenn ich mich net falsch erinner, in den Code Archiven einen Chat mit DirectPlay. DP taugt zwar nix aber du kannst die Struktur übernehmen und es mit TCP nachbilden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragDo, Jan 03, 2008 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
*Flinte ins Korn werf* Danke für die Hilfe aber ich mach nie wieder was mit TCP >.<
 

Dreamora

BeitragDo, Jan 03, 2008 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem Falle wirst du komplett auf jeglichen Multiplayersupport verzichten?

Schade speziell in anbetracht dessen, dass es eigentlich relativ simpel ist wenn man sich erst mit den Grundlagen und der zu grunde liegenden, nötigen, Programmstruktur befassen müsste und erst dann mit Coden anfangen.

Wie gesagt, schreib dir auf was der Server machen soll, was der client machen soll in den verschiedenen situationen und wie reagieren auf dinge die reinkommen und es wird komplett einfach.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragDo, Jan 10, 2008 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
... darüber hab ich schon tausendmal nachgedacht, aber irgendwas scheine ich ja falsch zu machen, nur weis ich net was!

Der Server soll:

Hosten
Warten auf Verbindung
Wenn im Stream was is dauerhaft readen

Das tut er ja nicht.

Der Client soll:

Verbindung aufbauen
Wenn ENTER gedrückt wurde den Text innen Stream writen

Ob er das macht kA.

Aber ich muss NUR EINMAL dieses verdammte Grundgerüst hinkriegen (ein simpler Chat;) damit ich mir dann auch für die Zukunft die Sache vertiefen kann!!!
 

Dreamora

BeitragDo, Jan 10, 2008 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Server stimmt so prinzipiell solange er nichts versenden soll.

Client hingegen stimmt so nicht. Denn was passiert nach dem Enter?
-> Muss wohl auch eine Form einer Loop haben Smile


Hier ein Pseudo Code Grundgerüst für einen Server:

Auf Verbindung warten
Wenn ankommende Verbindung aufgebaut, die StreamID setzen
So lange nicht "QUIT" auf dem Stream erhalten wird und der Stream nicht zu ende ist
>> Falls etwas auf dem Stream ist, lies es aus.

Problem hier von deinem code ist glaub offensichtlich ... du liest, nix da, gut hören wir. So geht das dann natürlich nicht. Der client muss dem server entweder mitteilen dass er hören kann mit auslesen (quit nachricht) oder der server reagiert auf das ende des streams mit dem hören des auslesens.
Das sind aber die einzigen gründe warum er den Stream nimmer überprüfen sollte

-> Du musst also bei deinen Überlegungen auch immer mitüberlegen was die Bedingungen sind, warum ein bestimmtes Verhalten weiter verfolgt werden sollte oder eben nicht.



Hier auch Pseudo Code


Verbindung zum Server aufbauen
Wenn Verbindung erfolgt, die StreamID setzen
Solange der User nicht beendet und der Stream besteht
>> lies input des users in eine temporäre Variable
>> wenn enter gedrückt wird, sende den inhalt der temporären variable an den server und setze sie ""


Hoffe das hilft dir
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ReLeNtLeSS

BeitragFr, Jan 11, 2008 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
hmkay...

Danke erstmal... war schon ma nen anfang^^ hab das ganze mal umgesetzt, allerdings nicht richtig, weil iwie nix ankommt...

Code: [AUSKLAPPEN]

;wieder mal ein chat xD

Graphics 800,600,32,2
Text 0,0,"[H]osten oder [J]oinen?"
WaitKey()

If KeyHit(35) Then ;Hosten

   tcpserver=CreateTCPServer(55555)
      If tcpserver<>0 Then
      Text 0,15,"Host erfolgreich"
      Else
      Text 0,15,"Host konnte nicht aufgebaut werden"
      EndIf
      
   Repeat
   tcpstream=AcceptTCPStream(tcpserver)   
      While Not tcpstream=0
         If ReadAvail(tcpstream) Then                     
            Text 0,30,ReadString$(tcpstream)
         EndIf
      Wend
   Until KeyHit(1)      
      
EndIf   
   
If KeyHit(36) Then ;Joinen

   Text 0,15,"IP: "
   Repeat
      ip_text=GetKey()
      If ip_text<>0 Then ip$=ip$+Chr(ip_text)
      Text 30,15,ip$
   Until KeyHit(28)                     
   
   openstream=OpenTCPStream(ip$,55555)
   Print ip$                           
      If openstream<>0 Then               
      Text 0,50,"Verbindung erfolgreich!"   
      WaitKey()
      Cls
      
         Repeat
         texteingabej=GetKey()                              
         If texteingabej<>0 Then textj$=textj$+Chr(texteingabej)      
            Text 0,0,texteingabej                              
            If KeyHit(28) Then                              
               text_darstellen_j=text_darstellen_j+15
               Text 0,text_darstellen_j,texteingabej
               WriteString openstream,Chr(texteingabej)
         EndIf
         Until KeyHit(1)
            
      Else   
                              
      Text 0,50,"Verbindung fehlgeschlagen!"   
      
      EndIf                           
   
EndIf


@Dreamora: Ich danke dir für deine ausdauernde Hilfe... das is echt nett^^

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group