sans-io模式,语言服务器协议实现

lsp的Python项目详细描述


sans-io模式下的语言服务器协议实现。它的灵感来自Sans-IO pattern。以及一些相关项目: -hyper-h2 -h11

因此,它可以很容易地与trio、asyncio或其他一些框架集成。

必需的python版本

python=3.6

功能

  1. 纯python实现
  2. 不与其他网站包相关
  3. 可以(应该)很容易地与诸如trio、asyncio等高级框架集成

如何安装

有两种方法可以安装lsp

  • 通过pip安装(推荐)
pip install lsp
  • 通过setup.py
  • 安装
python setup.py install

基本用法示例

客户端

importsocketfromlspimportConnection,NEED_DATA,DataReceived,MessageEndsock=socket.socket()sock.connect(("localhost",10001))conn=Connection("client")answer=input("Send request?(y/n)")whileanswer=="y":# use connection send_json method to convert json object to bytesrequest_data=conn.send_json({"method":"didOpen"})# then we can send data to serversock.sendall(request_data)whileTrue:# and then we can get next_event of connection, it can indicate# that what should we do.event=conn.next_event()# we need to receive data from serverifeventisNEED_DATA:try:data=sock.recv(1024)exceptConnectionResetError:print('The server connection is closed, So I will leave:)')conn.close()sock.close()exit(0)else:print("return from sock.recv")conn.receive(data)# we have receive data from serverelifisinstance(event,DataReceived):print("Receive event, content:")print(event)elifisinstance(event,MessageEnd):print("Server sending data complete.")break# then we can call get_received_data() to extract out what we getheader,response_body=conn.get_received_data()print("Response header from server:")print(header)print("Response body from server:")print(response_body)answer=input("Send request?(y/n)")conn.go_next_circle()

服务器端

importsocketfromlspimportConnection,NEED_DATA,RequestReceived,DataReceived,MessageEndsock=socket.socket()sock.bind(("0.0.0.0",10001))sock.listen(1)client_sock,addr=sock.accept()print(f"get connection from {client_sock}")conn=Connection("server")try:whileTrue:whileTrue:# call next event to indicate what server socket should do.event=conn.next_event()# no data coming yet, so the return value is NEED_DATAifeventisNEED_DATA:data=client_sock.recv(1024)ifdata==b"":print("Client connection is closed, I will exit.")exit(0)conn.receive(data)# Request header is coming :)elifisinstance(event,RequestReceived):print("Receive request header")print(event.to_data())# Request data is coming :)elifisinstance(event,DataReceived):print("Receive request data")print(event.to_data())# client has send data completely.elifisinstance(event,MessageEnd):print("Data receive complete:)")break# so we can call con.get_received_data to fetch what client send.received_data=conn.get_received_data()print(f"Receiving data: {received_data}")# send response back to client.print(f"Sending response to client")data=conn.send_json({"Content":"I am received:)"})client_sock.sendall(data)print(f"For now, go to next circle")# then we need to call go_next_circle, to get another request from client.conn.go_next_circle()finally:sock.close()

有关更多用法示例,请签出examples/servers文件夹中的文件。

LSP中的主API

  1. 要发送JSON数据吗?您可以尝试conn.send_json
  2. 想知道我们下一步该怎么做吗?你可以试试conn.next_event
  3. 收到数据后,请不要忘记呼叫conn.receive(data)。 它将数据保存到内部缓冲区中,并可以驱动 conn.next_event方法返回其他事件。
  4. 当接收到MessageEnd事件时,我们可以调用 conn.get_received_data获取传入数据。

我们将从下一个活动中获得主要活动

客户

客户端将从下一个事件中获取以下值:

  1. 需要数据-这表示我们需要从服务器接收数据。
  2. responseReceived-客户端有接收响应头。
  3. datareceived-客户端已接收respone正文。
  4. messageend-从服务器接收数据完成。

服务器

服务器端将从下一个事件中获取以下值:

  1. 需要数据-这表示我们需要从客户端接收数据。
  2. requestReceived-客户端有发送请求头,我们接收它。
  3. datareceived-服务器从客户端接收响应正文。
  4. messageend-客户端发送请求完成。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
请求响应模式的java JMS   java如何从SeleniumWebDriver中的“Span Type下拉列表”中选择值   java JPA相当于Hibernate的@Generated(GenerationTime.ALWAYS)   java ActiveMQ查询:如何启动   java如何在jsp文件中使用freemarker标记库?   java如何在TabsLayout中用另一个片段替换一个片段的内容?   国际化如何理解Java教程国际化定制资源包加载示例?   XML配置中的java spring log4j无法为日志信息创建文件   oracle11g JDK 6:有没有办法运行一个新的java进程来执行指定类的主方法   java在avro模式中使用“default”   缺陷跟踪我在哪里可以提交关于FOSS Java Sound实施组织的缺陷报告。类路径。冰岛。pulseaudio。Pulseaudiosourcedaline?   编码Java系统。在和系统中。Sun/Oracle和IBM JVM解决方案在读写标准字节数组方面存在差异   java如何将列表项作为查询参数添加到字符串url中?   将自定义库导出到可导入jar文件java