diff --git a/scripts/proxy/cliside.py b/scripts/proxy/cliside.py index ed5e0c1..7bfe50b 100644 --- a/scripts/proxy/cliside.py +++ b/scripts/proxy/cliside.py @@ -15,21 +15,65 @@ class ClientSide: self._local_ip = local_ip self._remote_ip = remote_ip self.local_conn = None + self.local_read_future = None self.remote_conn = None @gen.coroutine - def co_connect(self): + def co_connect2(self): while True: if not self.local_conn: [local_host, local_port] = self._local_ip.split(':') - local_conn = yield TCPClient().connect(local_host, local_port) + self.local_conn = yield TCPClient().connect(local_host, local_port) if not self.remote_conn: [remote_host, remote_port] = self._remote_ip.split(':') url = 'ws://%s:%s/websocket' % (remote_host, remote_port) - remote_conn = yield websocket_connect(url) + self.remote_conn = yield websocket_connect(url) - if self.local_conn: - pass + if self.local_conn and not self.local_read_future: + print('ok1') + self.local_read_future = self.local_conn.read_until(b"\n") + print('ok') + + if self.local_read_future: + self.local_read_future.fetch_next_chunk() + + @gen.coroutine + def co_localConnect(self): + [local_host, local_port] = self._local_ip.split(':') + self.local_conn = yield TCPClient().connect(local_host, local_port) + + @gen.coroutine + def co_remoteConnect(self): + [remote_host, remote_port] = self._remote_ip.split(':') + url = 'ws://%s:%s/websocket' % (remote_host, remote_port) + self.remote_conn = yield websocket_connect(url) + data = '' + while True: + data += yield self.remote_conn.read_message() + lines = data.split('\n') + if data[-1] == '\n': + data = lines[-1] + lines = lines[:-1] + for line in lines: + print(line) + msg = json.loads(line) + self.dispatchRemoteMsg(msg) + + def dispatchRemoteMsg(self, msg): + if msg['cmd'] == 'connect': + ioloop.IOLoop.current().spawn_callback(self.co_localConnect) + elif msg['cmd'] == 'socketClose': + pass + elif msg['cmd'] == 'forwardData': + pass + + @gen.coroutine + def co_connect(self): +# ioloop.IOLoop.current().spawn_callback(self.co_localConnect) + ioloop.IOLoop.current().spawn_callback(self.co_remoteConnect) + while True: + yield gen.sleep(0.1) def run(self): ioloop.IOLoop.current().run_sync(self.co_connect) + diff --git a/scripts/proxy/srvside.py b/scripts/proxy/srvside.py index f7ff080..55d35fb 100644 --- a/scripts/proxy/srvside.py +++ b/scripts/proxy/srvside.py @@ -50,6 +50,7 @@ class ServerSide: self.remoteConnIdx += 1 self.remotePending[conn.idx] = conn conn.localSocket = local_conn + print('zzzzzzzz') self.remotePendingMutex.release() local_conn.SendMsg({ 'remoteConnIdx' : conn.idx, @@ -70,7 +71,7 @@ class ServerSide: for remoteConn in self.remoteConnHash.values(): if remoteConn.localSocket == conn: try: - remoteConn.steam.close() + remoteConn.stream.close() except: pass except: @@ -113,7 +114,7 @@ class ServerSide: self.remotePendingMutex.acquire() if msg['remoteConnIdx'] in self.remotePending: local_conn = self.remotePending[msg['remoteConnIdx']] - local_conn.steam.write(base64.b64decode(msg['data'])) + local_conn.stream.write(base64.b64decode(msg['data'])) self.remotePendingMutex.release() def isConnectOk(self, connIdx): @@ -125,8 +126,8 @@ class ServerSide: class RemoteServerConnection(object): - def __init__(self, steam, address): - self.steam = steam + def __init__(self, stream, address): + self.stream = stream self.address = address self.idx = 0 self.localSocket = None @@ -154,15 +155,15 @@ class RemoteServer(tornado.tcpserver.TCPServer): async def handle_stream(self, stream, address): global app - conn = RemoteServerConnection(steam, address) + conn = RemoteServerConnection(stream, address) if not app.addRemoteConn(conn): stream.close() return - yield gen.sleep(2) + await gen.sleep(2) if not app.isConnectOk(conn.connIdx): stream.close() return - conn.handle_stream() + await conn.handle_stream() class LocalSocketHandler(tornado.websocket.WebSocketHandler):