Starchik1 commited on
Commit
9cb9bf5
·
verified ·
1 Parent(s): 4998714

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +32 -43
main.py CHANGED
@@ -1,51 +1,40 @@
1
- from flask import Flask, request, jsonify
2
- import random
3
- import string
4
- from threading import Lock
5
 
6
- app = Flask(__name__)
7
- lock = Lock()
8
  transfers = {}
9
 
10
- def generate_id():
11
- return ''.join(random.choices(string.ascii_letters + string.digits, k=8))
 
12
 
13
- @app.route('/create_transfer', methods=['POST'])
14
- def create_transfer():
15
- with lock:
16
- transfer_id = generate_id()
17
- transfers[transfer_id] = {
18
- 'sender': None,
19
- 'receiver': None,
20
- 'filename': request.json['filename'],
21
- 'filesize': request.json['filesize']
22
- }
23
- return jsonify({'transfer_id': transfer_id})
24
 
25
- @app.route('/register_sender/<transfer_id>', methods=['POST'])
26
- def register_sender(transfer_id):
27
- with lock:
28
- transfers[transfer_id]['sender'] = {
29
- 'ip': request.remote_addr,
30
- 'port': request.json['port']
31
- }
32
- return jsonify({'status': 'sender registered'})
33
 
34
- @app.route('/register_receiver/<transfer_id>', methods=['POST'])
35
- def register_receiver(transfer_id):
36
- with lock:
37
- transfers[transfer_id]['receiver'] = {
38
- 'ip': request.remote_addr,
39
- 'port': request.json['port']
40
- }
41
- return jsonify({'status': 'receiver registered'})
42
 
43
- @app.route('/get_peer_info/<transfer_id>')
44
- def get_peer_info(transfer_id):
45
- return jsonify({
46
- 'sender': transfers.get(transfer_id, {}).get('sender'),
47
- 'receiver': transfers.get(transfer_id, {}).get('receiver')
48
- })
49
 
50
- if __name__ == '__main__':
51
- app.run(host='0.0.0.0', port=5000)
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, WebSocket, WebSocketDisconnect
2
+ from fastapi.responses import HTMLResponse
3
+ import uuid
 
4
 
5
+ app = FastAPI()
 
6
  transfers = {}
7
 
8
+ class ConnectionManager:
9
+ def __init__(self):
10
+ self.active_connections = {}
11
 
12
+ async def connect(self, transfer_id: str, websocket: WebSocket):
13
+ await websocket.accept()
14
+ if transfer_id not in self.active_connections:
15
+ self.active_connections[transfer_id] = []
16
+ self.active_connections[transfer_id].append(websocket)
 
 
 
 
 
 
17
 
18
+ def disconnect(self, transfer_id: str, websocket: WebSocket):
19
+ self.active_connections[transfer_id].remove(websocket)
 
 
 
 
 
 
20
 
21
+ manager = ConnectionManager()
 
 
 
 
 
 
 
22
 
23
+ @app.post("/create_transfer")
24
+ async def create_transfer():
25
+ transfer_id = str(uuid.uuid4())
26
+ transfers[transfer_id] = {"status": "waiting"}
27
+ return {"transfer_id": transfer_id}
 
28
 
29
+ @app.websocket("/ws/{transfer_id}")
30
+ async def websocket_endpoint(websocket: WebSocket, transfer_id: str):
31
+ await manager.connect(transfer_id, websocket)
32
+ try:
33
+ while True:
34
+ data = await websocket.receive_bytes()
35
+ # Пересылаем данные всем подключенным получателям
36
+ for connection in manager.active_connections.get(transfer_id, []):
37
+ if connection != websocket:
38
+ await connection.send_bytes(data)
39
+ except WebSocketDisconnect:
40
+ manager.disconnect(transfer_id, websocket)