前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python服务器客户端通信

python服务器客户端通信

作者头像
零式的天空
发布2022-03-22 11:12:46
发布2022-03-22 11:12:46
4K00
代码可运行
举报
文章被收录于专栏:零域Blog零域Blog
运行总次数:0
代码可运行

这里主要使用python的flask框架搭建一个简易服务器端,然后使用httplib库作为客户端与服务端进行通信,传输json数据并统计打包,网络传输,解包的时间。

代码

代码语言:javascript
代码运行次数:0
运行
复制
##### http_server.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from flask import Flask
from flask.ext.restful import Resource, Api
from flask import request, make_response
import datetime
import json

app = Flask(__name__)
api = Api(app)

class data(Resource):
    def get(self):
        start_time = datetime.datetime.now()

        data = {}
        tmp_data = {}
        for i in xrange(1000):
            tmp_data[i] = {}
            tmp_data[i]["name"] = "tigerrose"
            tmp_data[i]["tag"] = "cool"
        data['data'] = tmp_data
        data = json.dumps(data)

        end_time = datetime.datetime.now()
        print 'Size: %s' % len(data)
        print 'Time: %s' % (end_time - start_time)
        
        return data
    
    def post(self):
        data = request.stream.read()
        json_data = json.loads(data)

        start_time = datetime.datetime.now()
        tmp_data = {}
        for d in json_data:
            tmp_data[d] = json_data[d]

        end_time = datetime.datetime.now()
        print 'Data Size: %s' % len(data)
        print 'Unpack Time: %s' % (end_time - start_time)
        
        return make_response('sucess')

api.add_resource(data, '/data/')

if __name__ == '__main__':
    app.run(debug=True)
代码语言:javascript
代码运行次数:0
运行
复制
##### http_client.py    
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import httplib
import datetime
import json
import urllib
import multiprocessing

def getData():
    url = 'http://127.0.0.1:5000/data/'
    conn = httplib.HTTPConnection('127.0.0.1', port=5000)

    start_time = datetime.datetime.now()
    conn.request(method="GET", url=url)
    response = conn.getresponse()
    res = response.read()

    end_time = datetime.datetime.now()
    print 'Size: %s' % len(res)
    print 'Time: %s' % (end_time-start_time)

def sendData():
    url = 'http://127.0.0.1:5000/data/'
    conn = httplib.HTTPConnection('127.0.0.1', port=5000)

    start_time = datetime.datetime.now()

    # prepare the data
    data = {}
    for i in xrange(100000):
        data[i] = {'name': 'tigerrose'}
    data = json.dumps(data)

    data_time = datetime.datetime.now()

    conn.request("POST", url, data)
    response = conn.getresponse()

    end_time = datetime.datetime.now()
    res = response.read()

    print 'Data Size: %s' % len(data)
    print 'Pack Time: %s' % (data_time-start_time)
    print 'Transform Time: %s' % (end_time-data_time)
    print res

if __name__ == '__main__':
    # 测试 POST 方法
    sendData()

运行结果

代码语言:javascript
代码运行次数:0
运行
复制
$python http_server.py 
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 328-155-210
代码语言:javascript
代码运行次数:0
运行
复制
$python http_cilent.py 
Data Size: 3188890
Pack Time: 0:00:00.368087
Transform Time: 0:00:01.012829
sucess

此时,服务器端也多了几行输出

代码语言:javascript
代码运行次数:0
运行
复制
Data Size: 3188890
Unpack Time: 0:00:00.106405
127.0.0.1 - - [03/May/2016 22:00:58] "POST http://127.0.0.1:5000/data/ HTTP/1.1" 200 -

结果说明

首先运行http_server, 开启服务,然后运行http_client, 运行客户端,发送数据给服务端并获取返回值,可以看到结果显示了数据打包,解包和网络传输以及数据大小的具体数值。

原理

1 服务端的搭建。服务端用的是flask restful做的简易app, 其中,api.add_resource(data, ‘/data/‘) 就是将继承自Resource并实现来get或者post方法的类映射到http://host:port/data/这个网络资源上。 app.run()方法是开启服务,debug参数为True代表是debug模式,好处是输出一些调试信息,并且当你修改http_server代码后它会自动重启服务,但是注意不要在实际项目中使用,会有安全隐患,默认的host地址是127.0.0.1, 端口是5000,可以传参数修改。

2 客户端搭建。 客户端使用httplib的HTTPConnection进行创建连接, request函数发送POST请求,如果是get请求将method改成GET即可。

3 数据传输。 我个人理解的数据传输就是发送POST请求到获取response返回结果的时间,而打包时间是生成json数据串的时间,解包是将传输的json数据读取到内存的过程。使用datetime.datetime.now()来获取当前时间,两个时间相减即是一段python代码所运行的时间。

参考

http://dormousehole.readthedocs.io/en/latest/ http://www.pythondoc.com/Flask-RESTful/quickstart.html http://www.jb51.net/article/66763.htm http://www.tuicool.com/articles/J3maU3F http://www.01happy.com/python-httplib-get-and-post/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
  • 运行结果
  • 结果说明
  • 原理
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档