पर वेबसॉकेट संदेश भेजना/प्राप्त करना मैंने एक सरल वेबसाकेट क्लाइंट लिखा था। मैंने SO पर पाया कोड का उपयोग किया, यहां: How can I send and receive WebSocket messages on the server side?।पायथन सॉकेट/वेबसॉकेट क्लाइंट
मैं Python 2.7
का उपयोग कर रहा हूं और मेरा सर्वर echo.websocket.org
80
टीसीपी पोर्ट पर है। असल में, मुझे लगता है कि मुझे संदेश प्राप्त करने में कोई समस्या है। (या हो सकता है भेजने के भी गलत क्या है?)
कम से कम मैं के बाद से मैं एक अच्छा हाथ मिलाना प्रतिक्रिया प्राप्त करते हैं, यह सुनिश्चित करें कि हाथ मिलाना सब ठीक है हूँ:
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 का उपयोग कैसे करना चाहिए, और पाइथन के साथ एक ही पैकेट बनाने की कोशिश की।
नकाबपोश नहीं डेटा सर्वर से ग्राहक के लिए,:
नकाबपोश डेटा, ग्राहक से सर्वर के लिए:
नीचे परीक्षण के लिए, मैं अपने ब्राउज़र का इस्तेमाल किया
आपकी सॉकेट परत स्तर ** उच्च ** है, आप पुनर्गठन के लिए सभी शीर्षकों तक नहीं पहुंच सकते हैं। उपयोग सॉकेट कनेक्शन के लिए तैयार पर केवल टीसीपी या यूडीपी का चयन करें। – dsgdfg
@dsgdfg: मुझे लगता है कि मैं आपको समझ में नहीं आया। मैं केवल 'echo.websocket.org' सर्वर पर एक संदेश भेजना चाहता हूं, बस इतना ही। मैं हेडर को संशोधित नहीं करना चाहता, बस हेडर का निर्माण करें जैसे कि इस सर्वर द्वारा उपयोग किया जाता है। मैंने जांच की कि वे Wireshark का उपयोग कैसे करना चाहिए, और पाइथन के साथ एक ही पैकेट बनाने की कोशिश की। कृपया मेरा संपादन देखें। – yak
डीकोड परिभाषा में आपके कोड और कोड के आधार पर आप एक मूलभूत अंतर है। आप लंबाई को प्राप्त करने के लिए केवल एक वर्ण को परिवर्तित करने पर निर्भर करते हुए इनपुट 'byteArray = stringStreamIn' इनपुट को परिवर्तित नहीं करते हैं। मूल कोड स्ट्रिंगस्ट्रीमइन में वर्ण के लिए संपूर्ण इनपुट स्ट्रिंग 'byteArray = [ord (character) को परिवर्तित करता है] ' –