import socket
import threading
import sys
# ------------------------------------------------------
class HttpServer:
@staticmethod
def handleRequest(cltSkt, addr):
reqBys = cltSkt.recv(1024)
if len(reqBys) == 0:
print(f'{addr}即将关闭!')
cltSkt.close()
return
req = reqBys.decode('utf-8')
reqHeader = req.split(' ', maxsplit=2) # 截取http请求第一行: GET /index.htm HTTP/1.1
reqUri = reqHeader[1]
respMsg = "<h1>{{content}} 欢迎光临</h1>"
if reqUri == '/index.htm':
respMsg = respMsg.replace('{{content}}', addr[0])
else:
respMsg = "<h1 color='red'>找不到页面</h1>"
resp = "HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=utf-8\r\n\r\n" + respMsg
cltSkt.send(resp.encode('utf-8'))
cltSkt.close()
def start(self, port, **kwargs):
self._svrSkt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._svrSkt.bind( ('localhost', port) )
self._svrSkt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self._svrSkt.listen(128)
print(f'服务启动,访问地址为:localhost:{port}')
while True:
cltSkt,addr = self._svrSkt.accept()
t = threading.Thread(group=None, target=self.handleRequest, args=(cltSkt,addr))
t.setDaemon(True)
t.start()
def stop(self):
self._svrSkt.close()
# ------------------------------------------------------
def main():
args = sys.argv
print(sys.argv) #py xxx.py 8080,那么argv[0]=xxx.py,argv[1]=8080
if len(args) != 2:
print("请输入py xxx.py 8080")
return
httpPortStr = args[1]
if not httpPortStr.isdigit():
print("请输入py xxx.py 8080")
return
httpPort = int(httpPortStr)
try:
httpSvr = HttpServer()
httpSvr.start(httpPort)
except KeyboardInterrupt:
httpSvr.stop()
# ------------------------------------------------------
if __name__ == '__main__':
main()
测试运行:
1. 命令行输入:py "hyb011 tcpHttpServer.py" 8080
2. 浏览器输入:http://localhost:8080/index.htm