Jump to content

Bitcoin.de Websockets closes after 90 seconds


Bitcoin2017
 Share

Recommended Posts

Hi,

ich habe ein Python Script für die websockets geschrieben. Allerdings wird die Verbindung immer nach ca. 86-90 Sekunden geschlossen - vom Server. 

Ich habe jetzt schon mehrere Varianten getestet - es ist immer der Server der die Verbindung beendet. 

Insofern ich zusätzlich eine Nachricht sende - als Keep-Alive - wird es auch nicht besser, bei einem Ping wird die Verbindung gleich geschlossen.

Soll das so sein? 

Link to comment
Share on other sites

vor einer Stunde schrieb Bitcoin2017:

Ergänzung dazu, es scheinen max. 86 Abfragen (getdata) möglich zu sein, bevor der Server die Verbindung schließt. Bei Erhöhung des eines Sleep timers auf 2 Sekunden bleibt die Session auch doppelt so lange aktiv. Warum ist das so?

Hi,

Kann es sein, dass Du da etwas falsch implementiert hast ? Der Unterschied zum Polling ist bei den Websockets ja gerade eben, dass der Server Daten schickt wenn er welche/neue hat. Es ist nicht Sinn und Zweck, dass  Du sie permanent abfrägst.

Link to comment
Share on other sites

vor 2 Stunden schrieb Bitcoin2017:

Ich frage nur den internen Recv Buffer ab, es sind keine GET requests. 

Anscheinend ja nicht :-)

Wäre Deine Aktion rein auf Deinen Rechner beschränkt, würde es keinen Unterschied machen ob du alle 2 Sekunden oder alle 2 MS den Buffer abfrägst.

Wirf doch mal deinen Code in den Ring, dann sieht man mehr

Link to comment
Share on other sites

Klar, hier:

import websockets

    <get hskey via requests>
    
    async with websockets.connect ('wss://ws.bitcoin.de/socket.io/1/websocket/' + str (hskey)) as websocket:
        try:
            while True:
                greeting = await websocket.recv()
                print (greeting)
        except websockets.exceptions.InvalidState:
            print (websocket.state)
            print ('Exit')

Link to comment
Share on other sites

  • 1 month later...

Moin,

hab das gleiche Problem mit meiner PHP Implementierung. 86 Sekunden und der Server macht zu.

Hat hier einer nen Tipp? Oder bleibt das Thema ein Rätsel?

Einfach ne reconnect ist ja blöd, da fehlen mir mit Pech ja ein paar Bewegungen, außer ich mach den zweiten Socket ein paar Sekunden vorher auf und gleiche ab. Klingt dann halt irgendwie nach gebastel.

Danke

bye
  eazy

Link to comment
Share on other sites

Zur Zusammenfassung:

  •  '"Websocket" ist in diesem Fall ein socket.io Server der neben websocket auch andere Möglichkeiten bietet um sich die Daten ausliefern zu lassen (Longpolling, etc.)
  • Die Schnittstelle liefern über https eine URI aus, die websocket spricht
  • Wenn man diese URI nutzt und sich mit dem websocket-framework der Wahl verbindet bricht die Verbindung nach ~90s ab und liefert keine Daten mehr
  • Auch websocket-pings helfen nicht

Bei mir hat es (in Python mit twisted als async-framework) funktioniert, wenn ich die gleiche https-Verbindung, mit der ich die URI abgefragt habe auf websocket upgrade, anstelle eine neue websocket-Verbindung mit der URI aufzubauen.

Websocket baut auf http auf und verwendet einen upgrade-handshake um sich auf das Format der Daten zu verständigen. Insofern kann jede http Verbindung websocket-tauglich gemacht werden, wenn man die richtigen Pakete schickt.

Die Abfrage liefert eine nonce und Reihe von Optionen. Wenn websocket dabei ist, kann man ein Upgrade anfordern. Die nonce wie in der Response, der websocket_key kann frei gewählt werden, muss aber gespeichert werden

GET /socket.io/1/websocket/%s HTTP/1.1		%nonce
Accept-Encoding: gzip, deflate, sdch
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: %s 				%websocket_key
Sec-WebSocket-Version: 13

Man bekommt wenn alles gut geht eine Antwort mit "Status 101" "Switching Protocol"

HTTP/1.1 101 Switching Protocols
Accept-Encoding:gzip, deflate
Connection:Upgrade
Sec-WebSocket-Accept:LlV+ly6R1Mi9Jn+/1+p6ps5ZoqM=

SHA1(websocket_key+Websocket_MAGIC) sollte gleich Sec-WebSocket-Accept sein.

Ab jetzt liefert die Verbindung im Websocket-Format. Details dazu lassen sich googlen. 2Byte Status ::: Daten oder so.

Die Heartbeats kann man mit bytearray([129,3])+bytes("2::") beantworten.

Edited by matthias.linden
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.