2016-11-14 14 views
0

python websocketクライアント用のサンプルコードをhereから取得しましたが、以下の問題が発生しています。私が問題になっていたので、私はこのコードに場所のカップルで、元1からのビットを編集した:Python websocketオブジェクトに 'write_message'という属性がありません。

  • は、connectメソッドを削除し、コンストラクタにそれを吸収合併しました。私は で、「self._ws_connection」が見つかりませんでした。

  • WebSocketClient __init __()メソッドを 'url'を受け入れるように変更しました。 を削除し、 ''引数を削除しました。私は '' ということを意味するのか分かりません。

Problem1:

Traceback (most recent call last): 
    File "websocketcli.py", line 138, in <module> 
    main() 
    File "websocketcli.py", line 129, in main 
    client.send('Hello world!') 
    File "websocketcli.py", line 49, in send 
    self._ws_connection.write_message(escape.utf8(json.dumps(data))) 
    File "https://stackoverflow.com/users/anjangam/pyvenv/venv/lib/python2.7/site-packages/tornado/websocket.py", line 970, in write_message 
    return self.protocol.write_message(message, binary) 
AttributeError: 'NoneType' object has no attribute 'write_message' 

問題2: 私はWbSocketClientコンストラクタから '*' を削除すると、私は、問題1注記に遭遇したものとほぼ同じ、次のエラーが表示されます。私はPythonバージョン2.7.8を使用しています。

Traceback (most recent call last): 
    File "websocketcli.py", line 138, in <module> 
    main() 
    File "websocketcli.py", line 129, in main 
    client.send('Hello world!') 
    File "websocketcli.py", line 52, in send 
    self._ws_connection.write_message(escape.utf8(json.dumps(data))) 
    File "https://stackoverflow.com/users/anjangam/pyvenv/venv/lib/python2.7/site-packages/tornado/websocket.py", line 970, in write_message 
    return self.protocol.write_message(message, binary) 
AttributeError: 'NoneType' object has no attribute 'write_message' 

クライアントコード:

from tornado import escape 
from tornado import gen 
from tornado import httpclient 
from tornado import httputil 
from tornado import ioloop 
from tornado import websocket 

import functools 
import json 
import time 


APPLICATION_JSON = 'application/json' 

DEFAULT_CONNECT_TIMEOUT = 60 
DEFAULT_REQUEST_TIMEOUT = 60 


class WebSocketClient(): 
"""Base for web socket clients. 
""" 
def __init__(self, connect_timeout=DEFAULT_CONNECT_TIMEOUT, 
      request_timeout=DEFAULT_REQUEST_TIMEOUT): 

    self.connect_timeout = connect_timeout 
    self.request_timeout = request_timeout 

def connect(self, url): 
    """Connect to the server. 
    :param str url: server URL. 
    """ 
    headers = httputil.HTTPHeaders({'Content-Type': APPLICATION_JSON}) 
    request = httpclient.HTTPRequest(url=url, 
            connect_timeout=self.connect_timeout, 
            request_timeout=self.request_timeout, 
            headers=headers) 
    self._ws_connection = websocket.WebSocketClientConnection(ioloop.IOLoop.current(), 
                request) 
    self._ws_connection.connect_future.add_done_callback(self._connect_callback) 
    print 'Connection: ', self._ws_connection 

    def send(self, data): 
     """Send message to the server 
     :param str data: message. 
     """ 
     if not self._ws_connection: 
      raise RuntimeError('Web socket connection is closed.') 

     self._ws_connection.write_message(escape.utf8(json.dumps(data))) 

    def close(self): 
     """Close connection. 
     """ 

     if not self._ws_connection: 
      raise RuntimeError('Web socket connection is already closed.') 

     self._ws_connection.close() 

    def _connect_callback(self, future): 
     if future.exception() is None: 
      self._ws_connection = future.result() 
      self._on_connection_success() 
      self._read_messages() 
     else: 
      self._on_connection_error(future.exception()) 

    @gen.coroutine 
    def _read_messages(self): 
     while True: 
      msg = yield self._ws_connection.read_message() 
      if msg is None: 
       self._on_connection_close() 
       break 

      self._on_message(msg) 

    def _on_message(self, msg): 
     """This is called when new message is available from the server. 
     :param str msg: server message. 
     """ 

     pass 

    def _on_connection_success(self): 
     """This is called on successful connection ot the server. 
     """ 

     pass 

    def _on_connection_close(self): 
     """This is called when server closed the connection. 
     """ 
     pass 

    def _on_connection_error(self, exception): 
     """This is called in case if connection to the server could 
     not established. 
     """ 

     pass 


class TestWebSocketClient(WebSocketClient): 

    def __init__(self, url): 
     WebSocketClient.__init__(self, url) 

    def _on_message(self, msg): 
     print(msg) 
     deadline = time.time() + 1 
     ioloop.IOLoop().instance().add_timeout(
      deadline, functools.partial(self.send, str(int(time.time())))) 

    def _on_connection_success(self): 
     print('Connected!') 
     self.send(str(int(time.time()))) 

    def _on_connection_close(self): 
     print('Connection closed!') 

    def _on_connection_error(self, exception): 
     print('Connection error: %s', exception) 


def main(): 
    client = TestWebSocketClient() 
    client.connect('ws://localhost:8888/ws') 
    client.send('Hello world!') 


    try: 
     ioloop.IOLoop.instance().start() 
    except KeyboardInterrupt: 
     client.close() 


if __name__ == '__main__': 
    main() 

答えて

1

あなたのpython 3.5の作品だけで罰金、参照元のコードは、しかし、私はあなたのpython 2.それはのためだろう破る理由のいくつかのバージョンを使用している疑いがありますあなたが言及したアスタリスクは、Python 2の機能ではありません。PEP 3102がこれについて語りますが、アスタリスクは、パラメータが指定された順序に依存するのではなく、キーワード引数を関数呼び出しに渡すだけです。

例えば、次のような機能:

# we can use positional arguments on this one 
def test(a, b): 
    print(a, b) 

# this will require keyword arguments to be supplied on function calls 
def test_keywords_args_required(*, a, b): 
    print(a, b) 

test(1, 2) # test can be called using positional arguments 
test_keywords_args_required(1, 2) # this will error out. Needs keywords args! 
test_keywords_args_required(a=1, b=2) # this will work! 

あなたは、もともとそのリンクから供給されたコードを使用し、アスタリスクを削除すると、コードは(のpython 2.7で確認)動作するはずです。

関連する問題