В настоящее время я работаю над настройкой базового скрипта WebSockets. Я могу заставить клиента подключиться к серверу, но всякий раз, когда сервер отправляет первое сообщение клиенту, клиент регистрирует ошибку и, насколько я могу судить, readyState открыт и должен разрешить прохождение сообщения. Сообщение имеет правильное начало / x00 и / xff. Я не могу понять, что не так.
РЕДАКТИРОВАТЬ: Вот коды, которые, кажется, вызывают любую ошибку. data.js просто хранит то, что сервер Python использовал для настройки сервера, поэтому мне нужно изменить только один файл, когда я тестирую его, а время порта еще не истекло.
на стороне клиента:
<html>
<head>
<script type="text/javascript" src="data.js">
</script>
<script type="text/javascript">
var ws, error
init = function() {
ws = new WebSocket("ws://127.0.0.1:"+port+"/websockets/main.py")
ws.onopen = function() {
console.log("Connected")
log("Connected")
}
ws.onmessage = function(e) {
console.log("Received data")
log(e.data)
}
ws.onerror = function(e) {
console.log(e)
ws.send("Error occurred. Resend")
}
}
log = function(msg) {
document.getElementById("log").appendChild(document.createElement("br"))
document.getElementById("log").innerHTML = document.getElementById("log").innerHTML+msg
}
</script>
</head>
<body onload="init()">
<div id="log">
</div>
</body>
</html>
на стороне сервера:
import threading, hashlib, socket, time, re, struct
class WebSocketThread(threading.Thread):
def __init__(self, channel, details, websocket):
self.channel = channel
self.details = details
self.websocket = websocket
threading.Thread.__init__(self)
def run(self):
print("> Received connection ", self.details[0])
self.handshake(self.channel)
while True:
self.interact(self.channel)
def finduser(self, client):
for user in self.websocket.users:
if user.socket == client:
return user
return 0
def send_data(self, user, data):
user.socket.send(self.wrap(data))
print ("> Sent data", data, "to", user)
def recv_data(self, client, count):
data = client.recv(count)
return data
def handshake(self, client):
shake = self.recv_data(client, 256)
our_handshake = self.create_response(shake)
client.send(our_handshake)
print ("> Accepted client ", self.finduser(client))
self.send_data(self.finduser(client), "Test")
def interact(self, client):
users = self.websocket.users
this_user = self.finduser(client)
data = self.unwrap(self.recv_data(client, 256))
print ("> Received data ", data, "from", this_user)
def create_response(self, data):
key3 = ""
lines = data.splitlines()
resource = re.compile("GET (.*) HTTP").findall(data)
resource = resource[0]
for line in lines:
parts = line.partition(": ")
if parts[0] == "Host":
host = parts[2]
elif parts[0] == "Origin":
origin = parts[2]
elif parts[0] == "Sec-WebSocket-Key1":
key1 = parts[2]
elif parts[0] == "Sec-WebSocket-Key2":
key2 = parts[2]
key3 = line
spaces1 = key1.count(" ")
spaces2 = key2.count(" ")
num1 = int("".join([c for c in key1 if c.isdigit()]))/spaces1
num2 = int("".join([c for c in key2 if c.isdigit()]))/spaces2
token = hashlib.md5(struct.pack(">II8s", num1, num2, key3)).digest()
return "HTTP/1.1 101 WebSocket Protocol Handshake\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Origin: %s\r\nSec-WebSocket-Location: ws://%s%s\r\nSec-WebSocket-Protocol: sample\r\n\r\n%s\r\n"% (origin, host, resource, token)
def unwrap(self, data):
return data[1:-1]
def wrap(self, data):
return ("\x00"+data+"\xff")