实现一个服务器,通过TCP协议和客户端通信
#server.py
from socketserver import BaseRequestHandler, TCPServer
class EchoHandler(BaseRequestHandler):
def handle(self):
print('Got connection from', self.client_address)
while True:
msg = self.request.recv(8192)
print(msg)
if not msg:
break
self.request.send(msg)
if __name__ == '__main__':
serv = TCPServer(('', 16888), EchoHandler)
serv.serve_forever()
#client.py
import time
from socket import socket, AF_INET, SOCK_STREAM
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 16888))
while True:
time.sleep(5)
s.send(b'Hello')
print(s.recv(8192))
-
定义了一个特殊的处理类,实现了一个 handle() 方法,用来为客户端连接服务。 request 属性是客户端socket,client_address 有客户端地址。 运行这个server.py服务器,运行client.py并打开另外一个Python进程连接这个服务器
-
默认情况下这种服务器是单线程的,一次只能为一个客户端连接服务。 如果你想处理多个客户端,可以初始化一个 ForkingTCPServer 或者是 ThreadingTCPServer 对象。
from socketserver import ThreadingTCPServer
if __name__ == '__main__':
serv = ThreadingTCPServer(('', 20000), EchoHandler)
serv.serve_forever()
- 还可以预先设置线程池
from socketserver import StreamRequestHandler, TCPServer
class EchoHandler(StreamRequestHandler):
def handle(self):
print('Got connection from', self.client_address)
# self.rfile is a file-like object for reading
for line in self.rfile:
# self.wfile is a file-like object for writing
self.wfile.write(line)
if __name__ == '__main__':
if __name__ == '__main__':
from threading import Thread
pool_t = 16
serv = TCPServer(('', 16888), EchoHandler)
for n in range(pool_t):
t = Thread(target=serv.serve_forever)
t.daemon = True
t.start()
serv.serve_forever()
实现服务器 例如:
from socket import socket, AF_INET, SOCK_STREAM
def echo_handler(address, client_sock):
print('Got connection from {}'.format(address))
while True:
msg = client_sock.recv(8192)
if not msg:
break
client_sock.sendall(msg)
client_sock.close()
def echo_server(address, backlog=5):
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(address)
sock.listen(backlog)
while True:
client_sock, client_addr = sock.accept()
echo_handler(client_addr, client_sock)
if __name__ == '__main__':
echo_server(('', 16888))
import time
from socket import socket, AF_INET, SOCK_STREAM
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 16888))
while True:
# time.sleep(5)
s.send(b'Hello')
print(s.recv(8192))