Why socket?——http vs socket 性能測試

                  上一篇 / 下一篇  2021-01-28 15:47:46 / 個人分類:性能測試

                    一、背景
                    為了提高爬蟲與爬蟲服務器的數據傳輸效率,將之前的 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
                    #coding:utf8
                    from twisted.web.resource import Resource
                    from twisted.web.server import Site
                    from twisted.web import resource
                    from twisted.internet import reactor
                    class Test(resource.Resource):
                        def render_POST(self, request):
                            return "<html>Hello, world!</html>"
                    root = Resource()
                    root.putChild("test", Test())
                    factory = Site(root)
                    port = 8081
                    print 'run server on %s' % port
                    reactor.listenTCP(port, factory)
                    reactor.run()
                    socket_server.py
                    #coding:utf8
                    from twisted.internet.protocol import Factory
                    from twisted.protocols.basic import LineReceiver
                    from twisted.internet import reactor
                    class Test(LineReceiver):
                        def dataReceived(self, data):
                            self.transport.write("<html>Hello, world!</html>")
                    class TestFactory(Factory):
                        def buildProtocol(self, addr):
                            return Test()
                    if __name__ == '__main__':
                        port = 8080
                        print 'listen on %s' %port
                        reactor.listenTCP(port, TestFactory())
                        reactor.run()
                    socket_server.py
                    #coding:utf8
                    import time
                    import functools
                    import requests
                    import json
                    import socket
                    data = json.dumps({'aaa':'bbb'})
                    count = 10000
                    def timer(func):
                        @functools.wraps(func)
                        def wrapper(*args, **kw):
                            t0 = time.time()
                            res = func(*args, **kw)
                            t_diff = time.time() - t0
                            print "%s, use time: %s"%(func.__name__, t_diff)
                            return res
                        return wrapper
                    @timer
                    def send_to_http_server():
                        url = 'http://127.0.0.1:8081/test'
                        for i in xrange(count):
                            requests.post(url, data=data)
                    @timer
                    def send_to_socket_server():
                        # 創建一個socket:
                        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        # 建立連接:
                        s.connect(('127.0.0.1', 8080))
                        for i in xrange(count):
                            s.send(data)
                            recv(s)
                        # 關閉連接:
                        s.close()
                    def recv(s):
                        # 接收數據:
                        while True:
                            # 每次最多接收1k字節,這里簡化了過程,實際生產環境中會更復雜
                            d = s.recv(1024)
                            return d
                    if __name__ == '__main__':
                        send_to_http_server()
                        send_to_socket_server()
                    4、運行
                    先啟動 http server 和 socket server, 然后啟動客戶端。
                    python http_server.py
                    python socket_server.py
                    python send_message.py
                    5、結果
                    可以看出,在發送1w次的情況下,使用socket的效率是http的20倍左右,所以為了提高效率還是要用socket的。

                  TAG: 性能測試 軟件測試技術

                   

                  評分:0

                  我來說兩句

                  Open Toolbar
                  亚洲欧洲自拍图片专区123_久久久精品人妻无码专区不卡_青青精品视频国产色天使_A免看的日黄亚洲