TCP-Stream wird nicht erkannt
Übersicht

![]() |
owareBetreff: TCP-Stream wird nicht erkannt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich habe folgendes Problem: Code: [AUSKLAPPEN] stream = CreateTCPServer(8080)
Repeat Cls While Not Eof(stream) Print ReadLine(stream) Wend Flip Until KeyDown(1) Ich habe hier mal einfach einen Server erstellt, und wollte die Daten auslesen, die reinkommen (ich weiß, HIER kommt nix rein weils keinen Client gibt ![]() While not eof(stream): "Stream does not exist" Kann ein Server seinen eigenen Stream nicht auslesen?? TIA oware |
||
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
"stream" ist einfach kein stream, sondern ein server ![]() per AcceptTcpStream lädst du aus einer NEUEN server-client verbindung den stream |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
oware |
![]() Antworten mit Zitat ![]() |
---|---|---|
aber wie kann ich dann als Host daten auslesen?
Kannst du mir mal ein Bsp schreiben? |
||
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] server = createtcpserver(80)
repeat stream = accepttcpstream(server) until stream byte = readbyte(stream) accepttcpstream liefert einen stream zurück, sobald eine neue verbindung aufgebaut wird, wenn du also nich speicherst, sondern wieder accepttcpstream ausführst, geht die verbindung verloren. |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
oware |
![]() Antworten mit Zitat ![]() |
---|---|---|
achso. Dann braucht man aber für jeden Client einen eigenen Stream, oder? (Ich weiß, langsam nervts bestimmt...) | ||
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nö, jeder Client baut 2 Streams auf. Ein Stream und den Server Daten zu senden, sowie ein Stream zum Empfangen. Der Server braucht auch nur 2. Ebenfalls einen zum Empfangen und zum senden. Ist eigentlich recht simple, wenn man n bischen übt. | ||
°_° °.° °~° °v° .. -.- |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
reicht nicht ein stream für die kommunikation?? | ||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
nicht für den server. Bei TCP reicht ein Stream für den Clienten sowohl zum Senden als auch zum Empfangen aus. | ||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
man lernt nie aus ![]() |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, eigentlich schon, aber wenn nun andere Clienten direkt mit dem Clienten, kommunizieren ist es schon besser 2 zu haben, wenn der Client nun trotzdem noch mit dem server kommunizieren soll. | ||
°_° °.° °~° °v° .. -.- |
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Client mit Client kann man nicht Kommunizieren lassen.
Ich würde dir Empfehlen für "Experimente und Tests" einen Server auf Port 80 zu verwenden. Das hat den Vorteil, dass du nicht auch noch einen Clienten schreiben musst, dafür kannst du dann einfach einen X-Beliebigen Browser nehmen. Beispiel: Code: [AUSKLAPPEN] svr = CreateTCPServer(80)
Print "Server" Repeat Stream = AcceptTCPStream(svr) If Stream Repeat z$ = ReadLine(stream) Print z$ Until z$ = "" Or Eof(stream) c = c + 1 WriteLine stream, "Hallo du da." CloseTCPStream(stream) End If Forever Edit: The Matrix. Es wäre mir neu, dass man einen Clienten direkt mit einen Anderen Clienten Kommunizieren lassen kann. ![]() Korrigier mich bitte, wenn ich falsch liege, pixelshooter sagte ja berreits man lernt nie aus ^^ |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja kla sicher, aber es wäre doch genauso möglich, dass sich 2 Clienten auf einem Server melden und der ihnen beide den Port geben, auf den die beiden Clienten hören. So könnte sich ein Client mit einem anderen direkt unterhalten. Aber natürlic muss halt immer n Server dafür laufen. | ||
°_° °.° °~° °v° .. -.- |
![]() |
oware |
![]() Antworten mit Zitat ![]() |
---|---|---|
schön, dass so viele Antworten kommen ![]() Erstmal danke an alle die hier geholfen haben, ich probier dann mal rum ![]() |
||
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
oware:
Im Server legst du dir am besten ein Type TClient an. Verbindet sich ein Client mit dem Server, speicherst du den Stream von AcceptTCPStream in eine Instanz von TClient. Der Type hat den Vorteil, dass die Instanzen intern als doppelt verkettete Liste gespeichert werden. Du gehst also mit einer For-Each-Schleife alle Clients durch, schaust mit ReadAvail, ob Pakete zum lesen vorhanden sind, und liest ggF. in While Not Eof(Client\Stream) ... Wend aus. Für mich völlig unklar, aber ich habe noch keine Möglichkeit gefunden zu prürfen, ob eine Verbindung überhaupt noch steht zum Client. If Eof(Client\Stream) = -1 Then ... reagiert nicht auf ein Disconnect. Theoretisch könntest du nach einen Disconnect einfach den Client aus der Liste mittels Delete Client löschen. Die Beispiele, wie sie im Tutorial, in der OH und auch bei Smily0412 zu finden sind, sorgen für Verwirrung. TheMatrix: Was du da beschreibst, ist Quatsch. Kommuniziert wird mit dem Server über einen Port. Wenn Daten von einem Client zum anderen übertragen werden sollen, so muss dies der Server regeln. Dafür muss man Protokolle entwerfen. mfg olli |
||
vertex.dreamfall.at | GitHub |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vertex, mach es so, wie ich. Ich verlange vom Clienten mittels einer Nachricht einen PING befehl. Nun misst der Server die Zeit, bis eine Antwort kam, und weiß gleich die Ping mit. Sollte nach 3 sekunden keine antwort da sein, wird die verbindung geschlossen.
Zu der Sache mit dem Browser: Man kann auch ganz andere Ports mit dem Browser anzeigen lassen. Dafür dient der :. Beispiel: "127.0.0.1:8080" |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
TheMatrix |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Vertex
Quatsch ises, aber mögliche ![]() Das mit dem Timeout kann man auch besser lösen. Gebe TClient das Feld pingtimer. Frage in einer schleife ab, ob millisecs()>=Client\Pingtimer ist. Wenn ja, dann delete Client. Pingtimer wird ständig aktualisiert, wenn der Server eine Meldung von dem Clienten erhält, was wiederum der Client dadurch handeln kann, dass er z.B. alle 5Sek ein Ping sendet. Dadurch wird auch gleich getestet, ob der Server überhaupt noch Online ist. |
||
°_° °.° °~° °v° .. -.- |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab ich das nicht in etwa so gesagt?
Deins ist übrigens sehr sinnlos. Es ist nicht nötig, jeden Schleifendurchlauf zu pingen. Es ist nahezu unmöglich, dass innerhalb eines Schleifendurchlaufs eine Antwort kommt. |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir ist schon klar, dass man das über Ping o.ä. lösen kann. Jedoch ist das nicht Aufgabe der Anwender-Schicht sondern ist schon in TCP fest verankert. Das man mit Blitz keinen Zugriff darauf hat, ist wie gesagt unverständlich. In Protokollen der oberen Schicht, wie HTTP, kann man nicht einfach mal ein Ping einführen. Das verstehen Server/Clients einfach nicht. Deswegen finde ich es ziemlicher Schrott, wenn es keine andere Möglichkeit gibt. Bei den Berkleysockets(darauf basiert ja Blitz) gibt es keinen direkten Befehl zum Prüfen der Verbindung, aber es gibt Möglichkeiten.
Hier meine Testprogramme: Server Code: [AUSKLAPPEN] Global Server%, Stream%, Client.TClient, Message$, Ln$
Type TClient Field Stream% Field Name$ ; Nur ein Platzhalter für später End Type AppTitle "TCP Server" Print "TCP Server" TCPTimeouts(2000, 2000) Server = CreateTCPServer(80) If Not Server Then Print "Can't create server" End EndIf While Not KeyDown(1) Stream = AcceptTCPStream(Server) If Stream Then Print "New client hast connected:" Print " IP: " + DottedIP(TCPStreamIP(Stream)) Print " Port: " + TCPStreamPort(Stream) Client = New TClient Client\Stream = Stream Client\Name = "Blub" EndIf For Client = Each TClient If Eof(Client\Stream) = -1 Then Print "Client has disconnected:" Print " IP: " + DottedIP(TCPStreamIP(Client\Stream)) Print " Port: " + TCPStreamPort(Client\Stream) Delete Client Else If ReadAvail(Client\Stream) Then Print "Package from" Print " IP: " + DottedIP(TCPStreamIP(Client\Stream)) Print " Port: " + TCPStreamPort(Client\Stream) Message = "" While Not Eof(Client\Stream) Ln$ = ReadLine(Client\Stream) Print ">" + Ln$ Message = Message + Ln + Chr(13) + Chr(10) Wend If Message Then Message = Left(Message, Len(Message) - 2) WriteLine(CLient\Stream, "OK: " + Message) EndIf EndIf Next Wend CloseTCPServer(Server) End Client: Code: [AUSKLAPPEN] Global Stream%
AppTitle "TCP Client" Print "TCP Client" TCPTimeouts(2000, 2000) Stream = OpenTCPStream(Input("ServerIP: "), 1234) If Not Stream Then Print "Can't create client" End EndIf While Not KeyDown(1) If Eof(Stream) = -1 Then Print "Server has disconnected" Exit EndIf If ReadAvail(Stream) Print "Package from Server" While Not Eof(Stream) Print ">" + ReadLine(Stream) Wend EndIf Message$ = Input("Message: ") If Message$ = "exit" Then Exit WriteLine(Stream, Message) Wend WaitKey() CloseTCPStream(Stream) End Blitz stürzt mir jetzt immer ab, um etwas dazu zu sagen. Naja, mir egal. Ich habe BMax, ein besseres, selbst geschriebenes Netzwerkmodul und da läuft alles erste Sahne. mfg olli |
||
vertex.dreamfall.at | GitHub |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group