2010-01-28 69 views
9

我剛剛通過erlang websockets示例從Joe Armstrong's blog我仍然是erlang的新手,所以我決定在python中編寫一個簡單的服務器,以幫助教我關於websockets(和希望通過解釋喬的代碼來解釋一些erlang)。我有兩個問題:喬的Erlang websocket示例的Python示例

1)我從頁面收到的數據包含'ÿ'作爲最後一個字符。這不會出現在erlang版本,我不能確定它來自哪裏固定 - 這是因爲utf-8和我編碼的字符串沒有解碼它們

2)我似乎從服務器發送數據(通過websocket) - 可以通過查看client.send()產生多少字節來確認。但是沒有任何內容出現在網頁上。 固定,我沒有正確編碼字符串

我已經把所有的代碼here。這裏是我的Python版本櫃面我缺少什麼明顯

import threading 
import socket 

def start_server(): 
    tick = 0 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(('localhost', 1234)) 
    sock.listen(100) 
    while True: 
     print 'listening...' 
     csock, address = sock.accept() 
     tick+=1 
     print 'connection!' 
     handshake(csock, tick) 
     print 'handshaken' 
     while True: 
      interact(csock, tick) 
      tick+=1 

def handshake(client, tick): 
    our_handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+"Upgrade:  WebSocket\r\n"+"Connection: Upgrade\r\n"+"WebSocket-Origin:  http://localhost:8888\r\n"+"WebSocket-Location: "+" ws://localhost:1234/websession\r\n\r\n" 
    shake = client.recv(255) 
    print shake 
    client.send(our_handshake) 

def interact(client, tick): 
    data = client.recv(255) 
    print 'got:%s' %(data) 
    client.send("clock ! tick%d\r" % (tick)) 
    client.send("out ! recv\r") 

if __name__ == '__main__': 
    start_server() 

對於那些誰沒有經過喬的例子運行,但仍想幫忙,你只需要通過Web服務器interact.html服務了,然後啓動您的服務器(代碼假定web服務器上的本地主機上運行:8888)

回答

10

對於那些有興趣誰,這是解決

import threading 
import socket 

def start_server(): 
    tick = 0 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(('localhost', 1234)) 
    sock.listen(100) 
    while True: 
     print 'listening...' 
     csock, address = sock.accept() 
     tick+=1 
     print 'connection!' 
     handshake(csock, tick) 
     print 'handshaken' 
     while True: 
      interact(csock, tick) 
      tick+=1 


def send_data(client, str): 
    #_write(request, '\x00' + message.encode('utf-8') + '\xff') 
    str = '\x00' + str.encode('utf-8') + '\xff' 
    return client.send(str) 
def recv_data(client, count): 
    data = client.recv(count)  
    return data.decode('utf-8', 'ignore') 

def handshake(client, tick): 
    our_handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+"Upgrade:  WebSocket\r\n"+"Connection: Upgrade\r\n"+"WebSocket-Origin: http://localhost:8888\r\n"+"WebSocket-Location: "+" ws://localhost:1234/websession\r\n\r\n" 
    shake = recv_data(client, 255) 
    print shake 
    #We want to send this without any encoding 
    client.send(our_handshake) 

def interact(client, tick): 
    data = recv_data(client, 255) 
    print 'got:%s' %(data) 
    send_data(client, "clock ! tick%d" % (tick)) 
    send_data(client, "out ! %s" %(data)) 

if __name__ == '__main__': 
    start_server() 

編輯爲liwp的要求:

您可以查看文件here的差別。基本上我的問題是我在發送/接收之前解碼/編碼字符串的方式。有一個websocket module正在爲Apache的谷歌代碼工作,我用它來找出我錯誤的地方。

+0

護理是一個更具體一點?試圖在網頁上區分這兩個文件有點困難。 – liwp 2010-01-28 13:06:49

0

感謝分享代碼。我在Windows中遇到了一個運行此代碼的問題。我認爲這對那些仍在思考的人可能會有所幫助。

  1. 我strink的空間,使其bacame '升級:WebSocket的'

  2. 確保您的主機頁面匹配的起源,在這種情況下,它是 'http://localhost:8888'

現在它對我來說工作很好。