• 使用一个非堵塞的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> "
    print(dic)
    if dic != None:
    for item in dic:
    xml += "<" + item + ">" + str(dic[item]) + "</" + item + "> "
    else:
    xml += "<rescode>0</rescode> <resmsg>未找到相关数据</resmsg> "
    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(" ")
    #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 '
    resp += 'Server:RsServer '
    resp += 'Content-Type: application/json;charset=utf-8 '
    resp += 'Connection: close '
    resp += 'Cache-Control: no-cache '
    resp += 'pragma: no-cache '
    resp += 'Content-Length: ' + str(len(rsp)) + ' '
    resp += rsp
    event.send(resp)
    else:
    rsp = wjdInterface(urlGetParams, url)
    # rsp = doTrader(json1, postUrl.split()[1])
    # rsp = "{中国}"
    resp = 'HTTP/1.1 200 OK '
    resp += 'Server:RsServer '
    resp += 'Content-Type: text/xml;charset=utf-8 '
    resp += 'Connection: close '
    resp += 'Cache-Control: no-cache '
    resp += 'pragma: no-cache '
    resp += 'Content-Length: ' + str(len(rsp)) + ' '
    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客户:

  • 相关阅读:
    CFileDialog打开多个文件失败 返回错误 FNERR_BUFFERTOOSMALL
    VC 控件集合
    [摘]思科认证三步走及找工作的七大职业走向
    windows无法配置此无线连接解决办法
    VS 2019 项目添加引用,提示:对COM组件的调用返回了错误HRESULT E_FAIL
    c# winform 获取当前程序运行根目录
    DataGridView 转换成 DataTable
    SQL Server日志文件过大 大日志文件清理方法 不分离数据库
    行动吧!让自己骚起来
    抖音很火的3D旋转相册 (源代码分享)
  • 原文地址:https://www.cnblogs.com/UUUz/p/11170670.html
Copyright © 2020-2023  润新知