
服务器同时处理多个客户的并发服务器有许多种方式,可以使用Unix的fork函数创建子进程
(fork示例参考)(http://www.cnblogs.com/bastard/archive/2012/08/31/2664896.html)
本章内容使用的是python的多线程实现并发服务。
服务端使用SoketServer网络服务框架
如果设置daemon守护线程(t.daemon=True),在主线程结束时,子线程也会结束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import socket import threading import SocketServer
class TCPServerHandler(SocketServer.BaseRequestHandler): def handle(self): self.data = self.request.recv(1024).strip() print "{} wrote:".format(self.client_address[0]) print self.data self.request.sendall(self.data.upper())
if __name__ == "__main__": host, port = "localhost", 6666 server = SocketServer.TCPServer((host, port), TCPServerHandler) t = threading.Thread(target=server.serve_forever) #t.daemon = True t.start()
# client sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try: sock.connect((host, port)) sock.sendall("hellon") rec = sock.recv(1024) finally: sock.close()
print rec
|
SocketServer.TCPServer(server_address, RequestHandlerClass, bind_and_activate=true)使用TCP协议,提供客户端与服务器之间的连续数据流。当bind_and_activate设置为true(默认为true),构造函数会自动尝试调用server_bind() 绑定地址和server_activate() 监听地址
1 2 3 4 5 6 7 8 9 10 11 12
|
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True): """Constructor. May be extended, do not override.""" BaseServer.__init__(self, server_address, RequestHandlerClass) self.socket = socket.socket(self.address_family, self.socket_type) if bind_and_activate: try: self.server_bind() self.server_activate() except: self.server_close() raise
|
近期评论