コード例 #1
0
ファイル: client.py プロジェクト: dermerkel/wssh
def connect(host, port, path='/'):
    try:
        try:
            ws = WebSocketClient("ws://{}:{}{}".format(host, port, path))
            ws.connect()

            def outgoing():
                fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)
                while True:
                    wait_read(sys.stdin.fileno())
                    line = sys.stdin.readline()
                    ws.send(line.strip())

            def incoming():
                while True:
                    print ws.receive()

            gevent.joinall([
                gevent.spawn(outgoing),
                gevent.spawn(incoming),
            ])
        except (IOError, HandshakeError), e:
            print e
            sys.exit(1)
    except KeyboardInterrupt:
        ws.close()
コード例 #2
0
 def test_secure_websocket_connection(self):
     ws = WebSocketClient('wss://127.0.0.1:5443/ws')
     ws.connect()
     print("Sending: 'Hello, World'...")
     ws.send("Hello, World")
     print("Sent")
     print("Receiving...")
     result = ws.receive()
     print("Received: {}".format(result))
     ws.close()
     self.assertEqual("Hello, World", str(result))
コード例 #3
0
 def publish(self, data, parsed_data):
     payload = parsed_data
     parsed = json.dumps(payload)
     evald = payload
     try:
         ws = WebSocketClient(socket_config['baseUrl'] +
                              str(evald['pipelineId']),
                              protocols=['http-only', 'chat'])
         ws.connect()
         ws.send(str(parsed))
         ws.close()
         return True
     except Exception as e:
         print e
         return False
コード例 #4
0
ファイル: client.py プロジェクト: GMD1987/wssh
def connect(host, port, path='/'):
    try:
        try:
            ws = WebSocketClient("ws://{}:{}{}".format(
                    host, port, path))
            ws.connect()
            def outgoing():
                fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)
                while True:
                    wait_read(sys.stdin.fileno())
                    line = sys.stdin.readline()
                    ws.send(line.strip())
            def incoming():
                while True:
                    print ws.receive()
            gevent.joinall([
                gevent.spawn(outgoing),
                gevent.spawn(incoming),
            ])
        except (IOError, HandshakeError), e:
            print e
            sys.exit(1)
    except KeyboardInterrupt:
        ws.close()
コード例 #5
0
class WebSocketTransport(object):
    def __init__(self):
        self.__connected = False
        self.__pool = Pool(1)
        self.__on_messsage = None
        self.__connection = None

    def set_on_message(self, func):
        def wrapper():
            while True:
                m = self.__connection.receive()
                if m is not None:
                    func(m.data)
                else:
                    break

        self.__on_message = wrapper

    #TODO: Flag to make sure only one connection
    def connect(self, url):
        if self.__connected == True:
            raise RuntimeError("Connect twice")
        self.__connection = WebSocketClient(url)
        self.__connection.connect()
        #self.__connected = True
        if self.__on_message is not None:
            self.__pool.spawn(self.__on_message)
        self.__connected == True

    def send(self, msg, is_binary=False):
        self.__connection.send(msg, is_binary)

    def close(self):
        self.__pool.join(timeout=0)
        self.__connection.close()
        self.__connected = False
コード例 #6
0
ファイル: client.py プロジェクト: rex8312/WebsocketExample
                ws.close()
                break
        else:
            break
    print("Connection closed!")


def outgoing(ws):
    for i in range(0, 40, 5):
        ws.send("*" * i)

    # We won't get this back
    ws.send("Foobar")

if __name__ == '__main__':
    ws = WebSocketClient('ws://127.0.0.1:8080/websocket', protocols=['http-only', 'chat'])
    ws.connect()

    for n in range(50):
        msg = json.dumps(dict(msg="Hello world", no=n))
        ws.send(msg)
        resp = str(ws.receive())
        print json.loads(resp)
    ws.close()

    # greenlets = [
        # gevent.spawn(incoming, ws),
        # gevent.spawn(outgoing, ws),
    # ]
    # gevent.joinall(greenlets)
コード例 #7
0
    def handle(self, source, address):
        '''
            1. parse browser socks5 message
            2. establishes WebSocket connection to a remote server
            3. encrypt data using RC4
            4. forward with both the local and remote server
        '''
        log('New connection from %s:%s' % address)

        log('greenlet is %r', gevent.getcurrent())

        rfile = source.makefile('rb', -1)

        try:
            recvcount = source.recv(262)
            log("recv count: %r: %r " % (recvcount, type(recvcount)))

            source.send(b'\x05\x00')

            wsdata = ''
            data = rfile.read(4)
            log('second pack %r: %r' % (type(data), data))

            cmd = ord(data[1])  # CMD
            addrtype = ord(data[3])  # ADDR type 0x01 Ipv4 address

            wsdata = data[3]  # append type of address

            if addrtype == 1:  # IPv4
                addrStr = rfile.read(4)
                addr = socket.inet_ntoa(addrStr)
                wsdata += addrStr
            elif addrtype == 3:  # Domain name
                domainlen = ord(rfile.read(1)[0])
                domain = rfile.read(domainlen)
                log('domain len and name: %d %s' % (domainlen, domain))
                # addr = handle_dns(domain)
                addr = socket.inet_ntoa('\x00\x00\x00\x00')  # 16777343
                wsdata += chr(domainlen)
                wsdata += domain

            portstr = rfile.read(2)
            port = struct.unpack('>H', portstr)
            wsdata += portstr  # append port

            if cmd == 1:
                reply = b"\x05\x00\x00\x01" + socket.inet_aton(
                    addr) + struct.pack(">H", port[0])
                log("send replay %r" % reply)

                source.send(reply)
                log('Begin data, %s:%s' % (addr, port[0]))

                ws = WebSocketClient(self.remotehost, protocols=['binary'])
                try:
                    # gevent.monkey 阻塞
                    ws.connect()
                    log("connect remote websocket server!")
                    log('send data %r:%r:%r' %
                        (wsdata, type(wsdata), len(wsdata)))

                    encryptor = RC4(self.key)
                    generator = encryptor.encrypter()
                    out = ''
                    for wc in wsdata:
                        out += chr((ord(wc) ^ generator.next()))

                    # send socks5 message
                    ws.send(out, True)

                    l1 = gevent.spawn(self.forward, source, ws, generator)
                    l2 = gevent.spawn(self.incoming, ws, source)

                    gevent.joinall([l1, l2])

                except socket.error as e:
                    log('Conn refused, %s:%s:%s' % (addr, port[0], e.message))
                    # Connection refused
                    reply = b'\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00'
                    source.send(reply)
                    raise e
                finally:
                    log('close websocket: ---------------------------')
                    ws.close()
            else:
                log('Unsupported cmd: %r' % cmd)
                reply = b"\x05\0x07\0x00\0x01"
                source.send(reply)
        except socket.error, (value, message):
            log('socks_handle socket error, %s' % (message))