私は簡単なWebSocketクライアントを作成しました。私はSOで見つけたコードを使用しました。ここではHow can I send and receive WebSocket messages on the server side?です。Pythonソケット/ WebSocketクライアントでWebSocketメッセージを送受信する
私はPython 2.7
を使用しており、私のサーバーはecho.websocket.org
の80
のTCPポートです。基本的には、メッセージの受信に問題があると思います。 (それとも送信はあまりにも間違っている?)私は良いハンドシェイク応答を受信するので
は、少なくとも私は、握手がすべてOKであることを確信しています:
HTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://example.com
Connection: Upgrade
Date: Tue, 02 May 2017 21:54:31 GMT
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Server: Kaazing Gateway
Upgrade: websocket
そして、私のコード:
#!/usr/bin/env python
import socket
def encode_text_msg_websocket(data):
bytesFormatted = []
bytesFormatted.append(129)
bytesRaw = data.encode()
bytesLength = len(bytesRaw)
if bytesLength <= 125:
bytesFormatted.append(bytesLength)
elif 126 <= bytesLength <= 65535:
bytesFormatted.append(126)
bytesFormatted.append((bytesLength >> 8) & 255)
bytesFormatted.append(bytesLength & 255)
else:
bytesFormatted.append(127)
bytesFormatted.append((bytesLength >> 56) & 255)
bytesFormatted.append((bytesLength >> 48) & 255)
bytesFormatted.append((bytesLength >> 40) & 255)
bytesFormatted.append((bytesLength >> 32) & 255)
bytesFormatted.append((bytesLength >> 24) & 255)
bytesFormatted.append((bytesLength >> 16) & 255)
bytesFormatted.append((bytesLength >> 8) & 255)
bytesFormatted.append(bytesLength & 255)
bytesFormatted = bytes(bytesFormatted)
bytesFormatted = bytesFormatted + bytesRaw
return bytesFormatted
def dencode_text_msg_websocket(stringStreamIn):
byteArray = [ord(character) for character in stringStreamIn]
datalength = byteArray[1] & 127
indexFirstMask = 2
if datalength == 126:
indexFirstMask = 4
elif datalength == 127:
indexFirstMask = 10
masks = [m for m in byteArray[indexFirstMask: indexFirstMask + 4]]
indexFirstDataByte = indexFirstMask + 4
decodedChars = []
i = indexFirstDataByte
j = 0
while i < len(byteArray):
decodedChars.append(chr(byteArray[i]^masks[j % 4]))
i += 1
j += 1
return ''.join(decodedChars)
# connect
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((socket.gethostbyname('echo.websocket.org'), 80))
# handshake
handshake = 'GET/HTTP/1.1\r\nHost: echo.websocket.org\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: gfhjgfhjfj\r\nOrigin: http://example.com\r\nSec-WebSocket-Protocol: echo\r\n' \
'Sec-WebSocket-Version: 13\r\n\r\n'
sock.send(handshake)
print sock.recv(1024)
# send test msg
msg = encode_text_msg_websocket('hello world!')
sock.sendall(msg)
# receive it back
response = dencode_text_msg_websocket(sock.recv(1024))
print '--%s--' % response
sock.close()
ここで何が間違っていますか?ハンドシェイク後に複雑になります。
dencode_text_msg_websocket
メソッドは空の文字列を返しますが、サーバーに送信するのと同じ文字列、つまりhello world!
を返します。
私はライブラリを使用したくありません(私はそれらを使用する方法を知っています)。問題は、ライブラリなしで、ソケットだけを使って同じことを達成することです。
私はecho.websocket.org server
にメッセージを送って応答を受け取るだけです。私はヘッダーを変更したくない、単にこのサーバーで使用されているようにヘッダーを作成するだけです。 Wiresharkをどのように使うべきかを確認し、同じパケットをPythonでビルドしようとしました。以下のテストのために
、私は自分のブラウザを使用:クライアントからサーバーへ
仮面データ、::
サーバからクライアントへのデータを、マスクされていません
ソケットレイヤーのレベルは**高**です。再構成のためにすべてのヘッダーにアクセスすることはできません。ソケット接続用にTCPまたはUDPのみを選択してください。 – dsgdfg
@dsgdfg:私はあなたを理解していないと思う。私は 'echo.websocket.org'サーバにメッセージを送りたいだけです。私はヘッダーを変更したくない、単にこのサーバーで使用されているようにヘッダーを作成するだけです。 Wiresharkをどのように使うべきかを確認し、同じパケットをPythonでビルドしようとしました。私の編集を見てください。 – yak
デコードの定義には、コードとそのコードに基づいた基本的な違いがあります。代わりに、単一文字を長さに変換するだけではなく、入力 'byteArray = stringStreamIn'を変換しません。元のコードは入力文字列 'byteArray = [stringStreamInの文字のord(文字)]を変換します。 –