51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 787|回复: 0
打印 上一主题 下一主题

Why socket?——http vs socket 性能测试

[复制链接]
  • TA的每日心情
    无聊
    12 小时前
  • 签到天数: 945 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-7-6 11:05:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、背景
      为了提高爬虫与爬虫服务器的数据传输效率,将之前的 HTTP 传输改成现在的 socket 传输。之前只知道 socket 的传输效率高于 http,但是不知道究竟高多少,今天写了 demo 简单测试了一下。
      二、知识准备
      先理解一下 HTTP、TCP/IP、Socket的概念(参考文章 http://itindex.net/detail/47119-socket-http
      HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的
      TCP协议: 对应于传输层
      IP协议: 对应于网络层
      TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
      Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
      socket 相当于一次连接,然后发送数据,直到数据发送完毕才断开连接。而 HTTP 相当于每次请求都建立连接,发送完数据,就关闭。主要的时间浪费在了建立连接上。
      三、实验
      1、环境
      python 2.7.10
      twisted 16.4.0
      2、过程
      使用 twisted 建立一个 socket server 和一个 http server,测试分别向两个 server 发送10000次数据花费的时间。
      3、代码
      代码地址:
      https://github.com/xsren/python_test_demo
      http_serve.py
    1. <font size="3"> #coding:utf8
    2.   from twisted.web.resource import Resource
    3.   from twisted.web.server import Site
    4.   from twisted.web import resource
    5.   from twisted.internet import reactor
    6.   class Test(resource.Resource):
    7.       def render_POST(self, request):
    8.           return "<html>Hello, world!</html>"
    9.   root = Resource()
    10.   root.putChild("test", Test())
    11.   factory = Site(root)
    12.   port = 8081
    13.   print 'run server on %s' % port
    14.   reactor.listenTCP(port, factory)
    15.   reactor.run()</font>
    复制代码
    socket_server.py
    1. <font size="3"> #coding:utf8
    2.   from twisted.internet.protocol import Factory
    3.   from twisted.protocols.basic import LineReceiver
    4.   from twisted.internet import reactor
    5.   class Test(LineReceiver):
    6.       def dataReceived(self, data):
    7.           self.transport.write("<html>Hello, world!</html>")
    8.   class TestFactory(Factory):
    9.       def buildProtocol(self, addr):
    10.           return Test()
    11.   if __name__ == '__main__':
    12.       port = 8080
    13.       print 'listen on %s' %port
    14.       reactor.listenTCP(port, TestFactory())
    15.       reactor.run()</font>
    复制代码
    socket_server.py
    1. <font size="3"> #coding:utf8
    2.   import time
    3.   import functools
    4.   import requests
    5.   import json
    6.   import socket
    7.   data = json.dumps({'aaa':'bbb'})
    8.   count = 10000
    9.   def timer(func):
    10.       @functools.wraps(func)
    11.       def wrapper(*args, **kw):
    12.           t0 = time.time()
    13.           res = func(*args, **kw)
    14.           t_diff = time.time() - t0
    15.           print "%s, use time: %s"%(func.__name__, t_diff)
    16.           return res
    17.       return wrapper
    18.   @timer
    19.   def send_to_http_server():
    20.       url = 'http://127.0.0.1:8081/test'
    21.       for i in xrange(count):
    22.           requests.post(url, data=data)
    23.   @timer
    24.   def send_to_socket_server():
    25.       # 创建一个socket:
    26.       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    27.       # 建立连接:
    28.       s.connect(('127.0.0.1', 8080))
    29.       for i in xrange(count):
    30.           s.send(data)
    31.           recv(s)
    32.       # 关闭连接:
    33.       s.close()
    34.   def recv(s):
    35.       # 接收数据:
    36.       while True:
    37.           # 每次最多接收1k字节,这里简化了过程,实际生产环境中会更复杂
    38.           d = s.recv(1024)
    39.           return d
    40.   if __name__ == '__main__':
    41.       send_to_http_server()
    42.       send_to_socket_server()</font>
    复制代码
    4、运行

      先启动 http server 和 socket server, 然后启动客户端。
    1. [size=3] python http_server.py
    2.   python socket_server.py
    3.   python send_message.py[/size]
    复制代码
    5、结果
      可以看出,在发送1w次的情况下,使用socket的效率是http的20倍左右,所以为了提高效率还是要用socket的。


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-9 22:00 , Processed in 0.063487 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表