سؤال

لقد كنت أعمل للتو من خلال مثال Erlang Websockets من مدونة جو أرمسترونغ ما زلت جديدًا تمامًا على Erlang ، لذا قررت أن أكتب خادمًا بسيطًا في Python من شأنه أن يساعدني في تعليمي حول WebSockets (ونأمل أن بعض Erlang من خلال تفسير رمز Joe). أواجه قضيتين:

1) تتضمن البيانات التي أتلقاها من الصفحة "ÿ" كآخر شار. لا يظهر هذا في إصدار Erlang ولا يمكنني العمل من أين يأتي ثابت - كان ذلك لأن الأوتار التي تم ترميزها في UTF -8 ولم أكن فك تشفيرها

2) يبدو أنني أرسل بيانات من الخادم (من خلال WebSocket) - والتي يمكن تأكيدها من خلال النظر في عدد Bytes 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()

بالنسبة لأولئك الذين لم يركضوا من خلال مثال جو ولكنهم لا يزالون يرغبون في المساعدة ، تحتاج فقط إلى خدمة التفاعل. html من خلال خادم ويب ثم بدء تشغيل الخادم الخاص بك (يفترض الرمز أن خادم الويب يعمل على مضيف محلي: 8888)

هل كانت مفيدة؟

المحلول

بالنسبة لأولئك المهتمين كان هذا هو الحل

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:

يمكنك عرض فرق في الملف هنا. كانت مشكلتي في الأساس هي الطريقة التي كنت أتخلص بها / ترميز السلاسل قبل إرسال / استلام. هناك وحدة WebSocket أن أعمل على Apache على رمز Google الذي اعتدت معرفة أين كنت مخطئًا.

نصائح أخرى

أشكرك على مشاركة الرمز. واجهت مشكلة واحدة في تشغيل هذا الرمز في Windows. وهو ما أعتقد أنه قد يساعد للأشخاص الذين ما زالوا يبحثون.

  1. أقوم بتشويش المساحة ، بحيث تكون "ترقية: WebSocket"

  2. تأكد من أن صفحة الاستضافة الخاصة بك تتطابق مع الأصل ، وهو في هذه الحالة "http: // localhost: 8888'

إنه يعمل بشكل جميل بالنسبة لي الآن.

Eventlet لديها دعم WebSocket مدمج و Stargate هي حزمة لاستخدام WebSockets مع إطار الويب الهرمي: http://boothead.github.com/stargate/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top