9

Joe Armstrong のブログの erlang websockets の例に取り組んでいます。私はまだ erlang にまったく慣れていないので、websocket について教えてくれる単純なサーバーを Python で作成することにしました (できれば、joe のコードを解釈することによっていくつかの erlang を学びます)。 . 私は2つの問題を抱えています:

1) ページから受け取るデータには、最後の文字として「ÿ」が含まれています。これは erlang バージョンには表示されず、それがどこから来ているのかわかりません

2) サーバーから (websocket を介して) データを送信しているようです。これは、client.send() が作成するバイト数を調べることで確認できます。しかし、ページには何も表示されません。修正しました。文字列を正しくエンコードしていませんでした

ここにすべてのコードを入れました。明らかな何かが欠けている場合に備えて、これが私の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()

joe の例をまだ実行していないが支援したい場合は、Web サーバー経由で interact.html を提供し、サーバーを起動するだけです (コードは、Web サーバーが localhost:8888 で実行されていることを前提としています)。

4

3 に答える 3

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の要求に合わせて編集します。

ここでファイルの差分を表示できます。本質的に私の問題は、送受信する前に文字列をデコード/エンコードする方法でした。どこが間違っているのかを見つけるために使用したGoogleコードのApache用に作業中のWebSocketモジュールがあります。

于 2010-01-28T10:48:54.697 に答える
0

EventletにはWebSocketサポートが組み込まれており、stargateはピラミッドWebフレームワークでWebSocketを使用するためのパッケージです:http://boothead.github.com/stargate/

于 2011-01-18T16:38:12.443 に答える
0

コードを共有していただきありがとうございます。このコードを Windows で実行すると、1 つの問題が発生しました。まだ考え中の方の参考になればと思います。

  1. 「アップグレード:WebSocket」になるようにスペースを打ちます

  2. ホスティング ページがオリジンと一致していることを確認します。この場合は「http://localhost:8888」です。

それは今私にとって美しく働いています。

于 2010-08-08T08:46:30.373 に答える