간단한 WebSocket 클라이언트를 작성했습니다. 내가 찾은 코드를 여기에 사용했습니다 : How can I send and receive WebSocket messages on the server side?.Python 소켓/WebSocket 클라이언트를 통해 WebSocket 메시지 보내기/받기
나는 Python 2.7
이고 내 서버는 echo.websocket.org
입니다. 80
TCP 포트입니다. 기본적으로 메시지를받는 데 문제가 있다고 생각합니다. (아니면 전송도 잘못?) 나는 좋은 핸드 쉐이크 응답을받을 수 있기 때문에
가 적어도 나는, 핸드 셰이크 모든 괜찮 확신 :
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
코드 정의와 코드를 기반으로하는 코드의 근본적인 차이점은 디코딩 정의에 있습니다. 단순히 byte를 변환하기 만하면 byteArray = stringStreamIn 입력을 변환하지 않는다. 원래 코드는 전체 입력 문자열'byteArray = [stringStreamIn에있는 문자의 ord (문자)]을 변환합니다. –