bybit-exchange / pybit

Official Python3 API connector for Bybit's HTTP and WebSockets APIs.
Other
339 stars 113 forks source link

websockets.exceptions.ConnectionClosedError: no close frame received or sent #196

Open hsh4269 opened 4 months ago

hsh4269 commented 4 months ago

Hi, I am a beginner. I'm asking because an error occurred randomly when connecting to the web socket. The error message is "websockets.exceptions.ConnectionClosedError: no close frame received or sent"

Bybit's API document recommends sending Heartbeat Packet every 20 seconds to maintain a websocket connection.

Like this ws.send(JSON.stringify({"req_id": "100001", "op": "ping"}));

It looks like this, but I don't think that part is working. How do I do Heartbeat Packet to maintain a websocket connection in pybit?

dextertd commented 4 months ago

You don't need to take any proactive measure to send a heartbeat packet with pybit. It does it for you.

The code you mention is for javascript, not python.

hsh4269 commented 3 months ago

So...... why does this happen?

dextertd commented 2 months ago

I'm not able to reproduce this, can you send the code you used?

hsh4269 commented 1 month ago

Process WebSocketManager-4:1: Traceback (most recent call last): File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 974, in transfer_data message = await self.read_message() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 1044, in read_message frame = await self.read_data_frame(max_size=self.max_size) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 1119, in read_data_frame frame = await self.read_frame(max_size) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 1176, in read_frame frame = await Frame.read( ^^^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\framing.py", line 69, in read data = await reader(2) ^^^^^^^^^^^^^^^ File "c:\Program Files\Python311\Lib\asyncio\streams.py", line 726, in readexactly raise exceptions.IncompleteReadError(incomplete, n) asyncio.exceptions.IncompleteReadError: 0 bytes read on a total of 2 expected bytes

The above exception was the direct cause of the following exception:

self.run()

File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\pybithumb\websocket.py", line 71, in run self.aloop.run_until_complete(self.connect_socket()) File "c:\Program Files\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\pybithumb\websocket.py", line 66, in __connect_socket recv_data = await websocket.recv() ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 568, in recv await self.ensure_open() File "C:\Users\HSH\AppData\Roaming\Python\Python311\site-packages\websockets\legacy\protocol.py", line 941, in ensure_open raise self.connection_closed_exc() websockets.exceptions.ConnectionClosedError: no close frame received or sent

The above error message is output. What is the cause? How can I solve this problem?

dextertd commented 1 month ago

It looks like you're not using the pybit library in this code. From the traceroute you're using the websockets library, but pybit doesn't use this – it uses websocket-client. So it looks like you're not using pybit here.

If you disagree, please send the code you used so that I can try reproducing this problem.

hsh4269 commented 1 month ago

import time import datetime as dt import math from multiprocessing import Process, Manager import asyncio from pybit.unified_trading import HTTP, WebSocket

######## Defines ########################### testnet = False

pybit = HTTP( testnet=testnet, api_key="111", #api key api_secret="111", #api secreat logging_level = 10, )

ws = WebSocket( testnet=False, channel_type="spot", )

def handle_message(message): global Bybit_Ask_0, Bybit_Bid_0, Bybit_Ask_Volume_0 try: orderbook_data = message["data"]

    Bybit_Ask_0 = float(orderbook_data['a'][0][0])
    Bybit_Ask_Volume_0 = float(orderbook_data['a'][0][1])
    Bybit_Bid_0 = float(orderbook_data['b'][0][0])

except Exception as e:
    print("handle_message" , e, dt.datetime.now(), sep='\t')
    pass  

############################################################ def main():

proc1 = Process(name="P_XRP",   target=sub_program, args=("XRP",))

proc1.start()   #XRP
time.sleep(1)

proc1.join()   #XRP

def sub_program(Set_Coin):

ws.orderbook_stream(1, 'XRPUSDT', handle_message)
time.sleep(3)
while True:
    print(Bybit_Ask_0, Bybit_Ask_Volume_0)

if name == "main":

main()

This one is I used code.

How can I solve this problem?