我正在尝试编写一个将在套接字上侦听HTTP响应的python应用程序。我正在使用http-parser。这是我的代码:
#!/usr/bin/env python
import socket
from http_parser.http import HttpStream
from http_parser.reader import SocketReader
from http_parser.util import b
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 7000))
s.listen(5)
try:
while True:
p = HttpStream(SocketReader(s))
finally:
s.close()
if __name__ == "__main__":
main()
我有两个问题:
修改 我想要做的是:我有三个盒子,一旦运行Apache,一个运行这个脚本,一个是客户端。当客户端连接到Apache并发回响应时,我将响应转移到此框。所以在这个脚本中,我正在尝试监听HTTP响应。
拓扑 这是我的拓扑: 服务器< ---->切换一个< ----->切换两个< ----->方框一和二 最初,第一个框连接到服务器并发送请求。当第二个交换机收到来自服务器的响应时,它会将其分配给第一个和第二个框。
答案 0 :(得分:3)
如果您真的想要在TCP套接字级别运行,那么这是一个非常好的实现。如果你想要更多的抽象,python有很多很多的HTTP服务器包,包括标准库的BaseHttpServer
,以及tornado和cherrypy等外部库/框架。
要测试您的HTTP侦听器,有很多选项。您可以在Python中编写完整的HTTP客户端测试代码(使用像urllib
这样的HTTP客户端库),或者您可以:
http://localhost:7000
telnet
到localhost上的端口7000并输入原始HTTP请求。使用nc
自动执行上述操作,例如:
echo -e 'GET / HTTP/1.1\n\n' | nc localhost 7000
关于术语的说明:您在绑定套接字上侦听的内容是HTTP 请求,用HTTP说法;您发送回连接客户端的是响应。
答案 1 :(得分:1)
1。有更好的方法吗?
是的,there is
2。我该如何测试呢?
通常的做法是将test.py放在同一个文件夹中,然后运行python test.py进行测试。示例代码:
#!python
# -*- coding: utf-8 -*-
import optparse
import urllib2
from django.utils import unittest
# just a sample of settings
HOST = 'localhost'
class GIOPTest(unittest.TestCase):
def test_basic(self):
#TEST GOES HERE
if __name__ == '__main__':
# This part is to accept command line parameters
option_list = ( # check optparse help for more options
make_option("--host",
action = 'store',
type = 'string',
dest = 'host',
default = 'localhost',
help = 'Server host (localhost by default)'
),
)
parser = OptionParser(option_list=option_list)
options, args = parser.parse_args()
HOST = options.host
# run the test
unittest.main()
答案 2 :(得分:1)
我最终使用原始套接字并直接从中读取数据包。
答案 3 :(得分:0)
如果您使用apache作为服务器,您将数据重定向到您可以使用apache基准测试(ab - 您必须是超级用户,但据我所知,使用它)来测试它...也将有所帮助评估您的应用程序对整个事物的性能影响,例如
ab -n 500 -c 20 http://localhost:7000/
其中-n是测试期间和服务器之间的连接总数,在-c之后你有apache基准测试会产生的并发连接数,试验这些的不同值,也可以阅读它的手册,你可能会找到更有用的选项,无论你的具体目的是什么