python版本的websocket服务

python写的简单websocket服务例子:

# coding=utf-8

import socket
import threading
import struct
import sys
import base64
import hashlib


def InitWebSocketServer():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.bind(("localhost", 3398))
        sock.listen(100)
    except:
        print "Server is already running,quit"
        sys.exit()
    while True:
        connection, address = sock.accept()
        print connection, address[0]
        if handshake(connection) != False:
            t = threading.Thread(target=DoRemoteCommand, args=(connection,))
            t.start()


def handshake(client):
    headers = {}
    shake = client.recv(1024)
    print shake
    if not len(shake):
        return False

    header, data = shake.split('\r\n\r\n', 1)
    for line in header.split("\r\n")[1:]:
        key, value = line.split(": ", 1)
        headers[key] = value

    if headers.has_key("Sec-WebSocket-Key") == False:
        print "this socket is not websocket,close"
        client.close()
        return False
    szOrigin = headers.get("Origin") or 'none'
    szKey = base64.b64encode(
        hashlib.sha1(headers["Sec-WebSocket-Key"] + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest())
    szHost = headers["Host"]

    our_handshake = "HTTP/1.1 101 Switching Protocols\r\n"                     "Upgrade:websocket\r\n"                    "Connection: Upgrade\r\n"                    "Sec-WebSocket-Accept:" + szKey + "\r\n"                     "WebSocket-Origin:" + szOrigin + "\r\n"                     "WebSocket-Location: ws://" + szHost + "/WebManagerSocket\r\n"                     "WebSocket-Protocol:WebManagerSocket\r\n\r\n"

    client.send(our_handshake)
    return True


def RecvData(nNum, client):
    try:
        pData = client.recv(nNum)
        if not len(pData):
            return False
    except:
        return False
    else:
        code_length = ord(pData[1]) & 127
        if code_length == 126:
            masks = pData[4:8]
            data = pData[8:]

        elif code_length == 127:
            masks = pData[10:14]
            data = pData[14:]
        else:
            masks = pData[2:6]
            data = pData[6:]

        raw_str = ""
        i = 0
        for d in data:
            raw_str += chr(ord(d) ^ ord(masks[i % 4]))
            i += 1

        return raw_str


def SendData(pData, client):
    if pData == False:
        return False
    else:
        pData = str(pData)

    token = "\x81"
    length = len(pData)
    if length < 126:
        token += struct.pack("B", length)
    elif length <= 0xFFFF:
        token += struct.pack("!BH", 126, length)
    else:
        token += struct.pack("!BQ", 127, length)
    pData = '%s%s' % (token, pData)
    client.send(pData)

    return True


def DoRemoteCommand(connection):
    while 1:
        connection.send('success')
        szBuf = RecvData(8196, connection)
        if szBuf == False:
            break
        else:
            SendData(szBuf, connection)


if __name__ == "__main__":
    InitWebSocketServer()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以使用多种来搭建WebSocket服务器,其中比较常用的是Tornado和WebSocket。以下是使用Tornado搭建WebSocket服务器的简单示例: 1. 安装Tornado ``` pip install tornado ``` 2. 编写WebSocket服务器代码 ```python import tornado.websocket import tornado.web import tornado.ioloop class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket opened") def on_message(self, message): print("Received message: {}".format(message)) self.write_message("You said: {}".format(message)) def on_close(self): print("WebSocket closed") app = tornado.web.Application([ (r"/websocket", WebSocketHandler), ]) if __name__ == "__main__": app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 3. 运行WebSocket服务器 ``` python server.py ``` 4. 在浏览器中测试WebSocket服务器 在浏览器中打开WebSocket客户端,连接到`ws://localhost:8888/websocket`,即可与WebSocket服务器进行通信。 ### 回答2: Python搭建WebSocket服务器,需要先理解WebSocket的基本概念和相关技术。WebSocket是一种基于TCP协议的全双工通信的网络协议,它允许Web应用程序在客户端与服务器之间建立持久性的连接。在WebSocket建立连接之后,客户端和服务器可以互相发送消息。相比较HTTP协议,WebSocket的实时性更高,特别适合一些需要实时推送数据的应用场景。 在Python中,可以通过Tornado、Twisted等框架来快速搭建WebSocket服务器。下面以Tornado为例,介绍一下如何搭建一个WebSocket服务器。 1. 安装Tornado 首先需要安装Tornado框架,可以通过pip命令进行安装,如下所示: ``` pip install tornado ``` 2. 编写WebSocket服务器代码 下面是一个简单的WebSocket服务器代码示例: ```python import tornado.websocket import tornado.web import tornado.ioloop class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print('WebSocket连接已打开') def on_message(self, message): print('收到客户端消息:{}'.format(message)) self.write_message('服务器已接收到消息:{}'.format(message)) def on_close(self): print('WebSocket连接已关闭') app = tornado.web.Application([(r'/ws', WebSocketHandler)]) if __name__ == '__main__': app.listen(8888) tornado.ioloop.IOLoop.instance().start() ``` 上述代码中,定义了一个WebSocketHandler类来处理WebSocket连接。在open方法中打印出WebSocket连接已打开的消息,在on_message方法中接收来自客户端的消息,并将消息打印出来并返回一个确认消息到客户端,在on_close方法中打印出WebSocket连接已关闭的消息。在WebSocket服务器启动时,将WebSocketHandler类添加到Tornado应用程序中,并绑定到指定的路由(本例中使用了/ws)上。 3. 运行WebSocket服务器 运行上述代码后,即可启动WebSocket服务器。可以使用任意的WebSocket客户端连接到WebSocket服务器,测试服务器是否工作正常。 总结 通过Tornado框架,可以快速搭建WebSocket服务器,实现实时数据推送等功能。当然,真正的应用场景中,还需要考虑WebSocket的负载均衡,数据安全等一系列问题。因此,在实际的开发过程中,还需要更深入的学习和实践,来构建稳定、可靠的WebSocket服务器。 ### 回答3: WebSocket是一种开放的标准,它提供了一种浏览器和服务器之间进行双向通信的方式。Python是一种强大的编程语言,它具有良好的数据处理和网络编程能力。因此,Python很适合用于搭建WebSocket服务器。 首先,我们需要使用Python的第三方Tornado或者Twisted等来搭建WebSocket服务器。这里以Tornado为例简要介绍一下搭建步骤。 步骤一:创建一个Tornado应用 我们可以使用Tornado框架的Application类来创建一个应用。在这个应用中,我们需要定义WebSocket路由以及对应的处理函数。 ``` python import tornado.ioloop import tornado.web import tornado.websocket class WebSocketHandler(tornado.websocket.WebSocketHandler): def open(self): print('WebSocket opened') def on_message(self, message): print('Message received: {}'.format(message)) def on_close(self): print('WebSocket closed') def make_app(): return tornado.web.Application([ (r'/websocket', WebSocketHandler), ]) if __name__ == '__main__': app = make_app() app.listen(8080) tornado.ioloop.IOLoop.current().start() ``` 在上面的代码中,我们定义了一个WebSocketHandler类来处理WebSocket连接。在这个类中,我们重载了WebSocketHandler的三个方法:open、on_message、on_close。这三个方法分别用于处理WebSocket连接建立,消息接收和连接关闭事件。 在make_app函数中,我们定义了路由,并将WebSocketHandler绑定到了路由上。我们通过调用app.listen方法来启动应用,使用IOLoop.current().start函数来启动事件循环。 步骤二:使用JavaScript创建WebSocket客户端 为了与服务器进行通信,我们需要使用JavaScript创建WebSocket客户端。这里我们通过浏览器提供的WebSocket API来创建客户端。 ``` javascript let socket = new WebSocket('ws://localhost:8080/websocket') socket.onopen = function () { console.log('WebSocket opened') } socket.onmessage = function (event) { console.log('Message received:', event.data) } socket.onclose = function () { console.log('WebSocket closed') } ``` 在这段代码中,我们使用浏览器提供的WebSocket构造函数来创建一个WebSocket客户端。我们将服务器的地址ws://localhost:8080/websocket传递给构造函数,这里的地址与在Python Web服务器中创建的WebSocket路由匹配。随后,我们在onopen,onmessage和onclose三个事件处理函数中定义了相应的逻辑。当WebSocket连接建立,消息接收或连接关闭时会分别触发这三个事件,并执行相应的逻辑。 到此,我们已经完成了基本的搭建过程,可以通过浏览器控制台的输出,观察WebSocket连接和消息的收发。 总结 在本文中,我们使用Python的Tornado框架来搭建了一个简单的WebSocket服务器,并通过使用浏览器提供的WebSocket API,创建了一个WebSocket客户端。WebSocket服务器提供了浏览器和服务器之间进行实时双向通信的方式,这种通信方式可以用于很多场景,比如实时游戏、即时聊天、在线会议等。通过Python搭建WebSocket服务器,可以使我们更加灵活地开发和管理这些应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值