图文精华

分享

你好,有下面一个demo

icoding 发表于 2024-5-17 11:07:30 [显示全部楼层] 回帖奖励 阅读模式 2 87
你好,有下面一个demo


import asyncio
import websockets
from urllib.parse import urlparse, parse_qs

async def proxy(websocket, path):
    query = parse_qs(urlparse(path).query)
    target_url = query.get("url", [""])[0]
    if not target_url:
        await websocket.close()
        return
    try:
        async with websockets.connect(target_url) as target_ws:
            async def forward(src, dst):
                async for message in src:
                    await dst.send(message)

            await asyncio.gather(forward(websocket, target_ws), forward(target_ws, websocket))
    except Exception as e:
        print(f"Error: {e}")
        await websocket.close()

start_server = websockets.serve(proxy, "0.0.0.0", 7000)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

它的作用是启动一个ws服务,运行在10.122.122.122的设备上,当收到ws://10.122.122.122:70000?url=ws://10.133.133.133:20004/term的消息时,会获取url的参数,和ws://10.133.133.133:20004/term建立连接,并将收到的消息转发给ws://10.133.133.133:20004/term,监听响应,并转发回去,相当于一个代理,转发给url中地址,并把参数和响应做一个互相的转发。
上面是一个demo跑通了,但实际的业务场景是在一个django项目中,ws是用channels集成到django中的,我建好了一个类,
class DevicechangesProxyConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        changes_url = self.scope['query_string'].decode('utf-8')
        if 'url=' in changes_url:
            self.changes_url=changes_url.replace('url=','')

        await self.accept()


    async def disconnect(self, close_code):
        pass


    async def receive(self, text_data=None, bytes_data=None, **kwargs):
        pass


    async def websocket_disconnect(self, message):
        pass
你可以把上面demo中的功能集成到这个类中实现类似的功能吗?

已有(2)人评论

跳转到指定楼层

0

主题

0

回帖

-7

积分

站内AI

积分
-7
ChatGPT 发表于 2024-5-17 13:17:44

你好!看起来你正在尝试将一个WebSocket代理集成到Django项目中。根据您提供的信息,您已经创建了一个名为DevicechangesProxyConsumer的类,并实现了connect,disconnect和receive方法。我想确认您是否已经在Django项目中成功运行了这个类?如果是,那么您只需要将代理逻辑添加到receive方法中即可。具体来说,您可以使用asyncio和websockets库来实现与目标WebSocket服务器的连接,并将从客户端接收到的消息转发到目标服务器。您需要将parse_qs和urlparse方法添加到您的类中,以从客户端请求中提取目标URL。请注意,您需要将asyncio循环添加到您的Django项目中,以便异步代码能够正确运行。希望这可以帮助您实现您的目标!

5

主题

2

回帖

33

积分

管理员

积分
33
icoding 发表于 2024-5-17 13:22:02
test
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则