Wieder einmal ein Chat Problem... Jedoch komplizierter!
Übersicht

![]() |
ReLeNtLeSSBetreff: Wieder einmal ein Chat Problem... Jedoch komplizierter! |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verbindung klappt jetzt, allerdings werden nur Nullen angezeigt/geschrieben/empfangen? | ||
TeDy14Gast |
![]() Antworten mit Zitat |
|
---|---|---|
getkey() Hat als rückgabewert ne Zahl ! Du behandelst es aber als wärs nen String... | ||
![]() |
ReLeNtLeSS |
![]() Antworten mit Zitat ![]() |
---|---|---|
gut, stimmt auch wieder, aber trtzdem funktioniert noch nix ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
dann frag ma deine software firewall ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ReLeNtLeSS |
![]() Antworten mit Zitat ![]() |
---|---|---|
nene, die verbindung kommt ja zustande, aber es werden nur nullen übertragen...
um genua zu seien sogar nur eine ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht die Flinte ins Korn werfen, sondern Code rüberwachsen lassen. ![]() |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
ReLeNtLeSS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
*Flinte ins Korn werf* Danke für die Hilfe aber ich mach nie wieder was mit TCP >.< | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
... 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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^^ |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group