使用一个非堵塞的socket用于接收http请求

需求:客户需要通过HTTP请求(URL)方式访问子系统,用于请求XXX数据,返回XML数据格式。

方案:使用一个python脚本来起一个socket服务,用于客户来访问该服务获取数据。

代码如下:

  以下代码处理两个不同的客户访问我们服务,上下文分别为/doTrader  一个返回json字符串   /wjdInterface 一个返回XML报文

def doTrader(paramXml, httpUrl):
  xxxxxx
  
  return json.dumps(results)
 
def wjdInterface(paramXml, httpUrl):
  xxxxx
  
  res_xml = makeXmlForHandle(results)
  return res_xml

# 将对象编辑成XML报文格式
def makeXmlForHandle(dic):
xml = "<FUND_RECORD>\n"
print(dic)
if dic != None:
for item in dic:
xml += "<" + item + ">" + str(dic[item]) + "</" + item + ">\n"
else:
xml += "<rescode>0</rescode>\n<resmsg>未找到相关数据</resmsg>\n"
xml += "</FUND_RECORD>"
return xml

----------------------------------------------------------------------------------------------------------------------------
from flask import Flask
from flask_spyne import Spyne
from spyne.model.primitive import Unicode, Integer
from spyne.model.complex import Iterable
from spyne import Application as TraderService
from spyne import rpc
from spyne import ServiceBase
from spyne import Iterable, Integer, Unicode, String
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from dateutil.relativedelta import relativedelta
from HBase import HBase
import sys
from hbase.ttypes import ColumnDescriptor, Mutation, BatchMutation
from ELSearch import ELSearch
import logging
import datetime
import urllib
import urllib2
import json
import time
import select
import os
import sys
import socket
import threading # install
socketHost="0.0.0.0"
sport = sys.argv[1]
iport = int(sport)
socketPort =iport
today = datetime.datetime.today()
# logging.basicConfig()
# reload(sys)
# sys.setdefaultencoding('utf-8')
# count = 0
elHost = "127.0.0.1"
elPort = 9200
# # 业务系统接口
interfaceURL = "http://127.0.0.1:9010/gjj/intservice"
elSearch = ELSearch(elHost, elPort)
#设置默认编码 用于解决URL方法获取结果后转为中间编码超长(128)问题
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)

def process(event):
try:
event.setblocking(0)
data = event.recv(buffLen)
if data:
arr = data.split("\r\n")
#post提交的参数
json1 = arr[len(arr) - 1]
postUrl = ""
rsp = "" # 相应报文
context, url, urlGetParams = getContextAndParams(arr[0])
if (len(arr) > 0):
if context == "doTrader":
rsp = doTrader(json1, url)
# rsp = doTrader(json1, postUrl.split()[1])
# rsp = "{中国}"
resp = 'HTTP/1.1 200 OK\r\n'
resp += 'Server:RsServer\r\n'
resp += 'Content-Type: application/json;charset=utf-8\r\n'
resp += 'Connection: close\r\n'
resp += 'Cache-Control: no-cache\r\n'
resp += 'pragma: no-cache\r\n'
resp += 'Content-Length: ' + str(len(rsp)) + '\r\n\r\n'
resp += rsp
event.send(resp)
else:
rsp = wjdInterface(urlGetParams, url)
# rsp = doTrader(json1, postUrl.split()[1])
# rsp = "{中国}"
resp = 'HTTP/1.1 200 OK\r\n'
resp += 'Server:RsServer\r\n'
resp += 'Content-Type: text/xml;charset=utf-8\r\n'
resp += 'Connection: close\r\n'
resp += 'Cache-Control: no-cache\r\n'
resp += 'pragma: no-cache\r\n'
resp += 'Content-Length: ' + str(len(rsp)) + '\r\n\r\n'
resp += rsp
event.send(resp)
except Exception, e:
print(e)
event.close()
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.setblocking(0)
server.bind((socketHost,socketPort))
server.listen(1024)
print("Bind "+socketHost+":"+str(socketPort)+" ok!")
inputs=[server,]
buffLen=25600
while True:
r_list,w_list,e_list=select.select(inputs,[],[],1)
for event in r_list:
if event==server:
ss,addr=event.accept()
inputs.append(ss)
else:
thread = threading.Thread(target=process, args=(event,))
thread.start()
inputs.remove(event)

---------------------------------------------------------------------------
启动脚本 restart.sh
单线程脚本内容

      pkill -9 -f ys.py
      nohup python -u ys.py 6030 &

------------------------------------------------------------------------------------------------------------------------

通过POSTMAN发送http请求

A客户:

 

B客户:

 

posted on   丶柚子  阅读(932)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示