Python网络编程(二)通过ThreadingMixIn实现多线程异步套接字程序

使用ThreadingMixIn类的特点: 在线程间共享应用的状态,与使用ForkingMixIn类相比避免进程间通信的复杂操作。

代码如下:

 1 #! /usr/bin/python
 2
 3 import os
 4 import socket
 5 import threading
 6 import SocketServer
 7
 8 SERVER_HOST = ‘localhost‘
 9 SERVER_PORT = 0
10 BUF_SIZE = 1024
11
12 def client(ip, port, message):
13     """A client to test threading mixin server"""
14     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15     sock.connect((ip, port))
16     try:
17         sock.sendall(message)
18         response = sock.recv(BUF_SIZE)
19         print "Client received: %s" % response
20     finally:
21         sock.close()
22
23
24 class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
25     """An example of threaded TCP request handler """
26     def handle(self):
27         data = self.request.recv(1024)
28         current_thread = threading.current_thread()
29         response = "%s: %s" % (current_thread.name, data)
30         self.request.sendall(response)
31
32 class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
33     """Nothing add here, inherited everything from parenets"""
34     pass
35
36 if __name__ == ‘__main__‘:
37     #run server
38     server = ThreadedTCPServer((SERVER_HOST, SERVER_PORT), ThreadedTCPRequestHandler)
39     ip, port = server.server_address
40
41     # start a thread with the server, one thread per request
42     server_thread = threading.Thread(target=server.serve_forever)
43     # Exit the server thread when the main thread exits
44     server_thread.daemon = True
45     server_thread.start()
46     print "Server loop running on thread: %s" % server_thread.name
47
48     # run clients
49     client(ip, port, "Hello from client1")
50     client(ip, port, "Hello from client2")
51     client(ip, port, "Hello from client3")
52
53     #server cleanup
54     server.shutdown()
55    

注意点1,在写ThreadedTCPRequestHandler类中的方法handle的时候将handle写为了handler,结果在执行程序后,显示服务器返回给客户端的信息为空,原因是handle方法是ThreadedTCPRequestHandler类所继承的BaseRequestHandler类的类方法,由于BaseRequestHandler类的handle方法默认行为是啥也不做,所以要覆写handle方法来处理接受客户端消息,处理客户端请求,如果写为handler则在程序中默认调用了父类BaseRequestHandler的handle方法,但是啥也没做,所以显示服务器返回信息为空。

RequestHandler.handle()

This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are available to it; the request is available as self.request; the client address as self.client_address; and the server instance as self.server, in case it needs access to per-server information.

The type of self.request is different for datagram or stream services. For stream services, self.request is a socket object; for datagram services, self.request is a pair of string and socket. However, this can be hidden by using the request handler subclasses StreamRequestHandler or DatagramRequestHandler, which override the setup() and finish() methods, and provide self.rfile and self.wfile attributes. self.rfile and self.wfile can be read or written, respectively, to get the request data or return data to the client.

注意点2,关于线程对象的setDaemon属性,为True表示服务器线程为后台线程,当没有活动连接到后台线程时,程序执行完毕自动退出,当没有活动的非后台线程活动时,执行完毕程序才会自动退出。对于本代码,具体表现是如果在setDaemon为True的状态,不执行服务器套接字的shutdown(),程序执行完一样会自动退出,而setDaemon为False的状态, 则一定要执行shutdown(),程序才会自动终止。

时间: 2024-10-18 21:48:45

Python网络编程(二)通过ThreadingMixIn实现多线程异步套接字程序的相关文章

网络编程[第二篇]基于udp协议的套接字编程

udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息,只需自己发送了即可 二.客户端 import socket #买手机 -- 套接字家族 | 端口协议 phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #服务端地址 ip_port = ('127.0.0.1',8001) #实现多次发送

《Python》网络编程之客户端/服务端框架、套接字(socket)初使用

一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯,而这两个分类又对应了两个软件开发的架构 1.C/S架构 C/S即:Client与Server,中卫意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的. 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装

python开发socket网络编程基础:粘包问题&udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

Unix网络编程学习笔记之第7章 套接字选项

一.获取/设置套接字选项的方法 一个套接字描述符相关联的套接字选项很多.获取/设置套接字选项的方法: 1.  getsockopt和setsockopt函数 2. fcntl函数 3. ioctl函数 二. getsockopt和setsockopt函数 int getsockopt(int sockfd, int level, int optname, void* optval, socklen_t* optlen); int setsockopt(int sockfd, int level,

UNIX网络编程笔记(3)—基本TCP套接字编程

基本TCP套接字编程 主要介绍一个完整的TCP客户/服务器程序需要的基本套接字函数. 1.概述 在整个TCP客户/服务程序中,用到的函数就那么几个,其整体框图如下: 2.socket函数 为了执行网络I/O,一个进程必须要做的事情就是调用socket函数.其函数声明如下: #include <sys/socket.h> int socket(int family ,int type, int protocol); 其中: family:指定协议族 type:指定套接字类型 protocol:指

【学习笔记】Python网络编程(二)socket处理多个连接

贴代码,server端: import socket # s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) host =  '' port = 6074 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(1) while 1:     conn,addr = s.accept()     while 1:         pri

TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接

基于TCP的半关闭 TCP中的断开连接过程比建立连接过程更重要,因为建立连接过程一般不会出现什么大的变数,但断开过程就有可能发生预想不到的情况,因此要准确的掌控. 单方面断开连接带来的问题 Linux的close函数和Windows的closesocket函数是完全断开连接.完全断开是指无法传输数据也不能接收数据.因此,一方这样直接断开连接就显得不太优雅了.如:主机A发送完最后的数据后,调用close函数单方断开了连接,那么最终,由主机B传输的,主机A必须接收的确认数据也销毁了(四次握手). 为

【TCP/IP网络编程】:07优雅地断开套接字连接

本篇文章简单讨论了TCP套接字半关闭的相关知识. 通常来说,TCP建立连接的过程相对稳定,因为此时并未开始进行数据交换:而断开连接的过程由于已发生了数据交换,可能会发生一些预想不到的情况. 单方面断开连接带来的问题 前文所述的内容中,我们直接调用了close函数进行了完全断开连接,这就意味着本端既无法再发送数据,也不能再接收数据了.而如果本端仅仅希望不再发送数据,还能够接收数据的话,直接调用close完全断开连接则显得不够优雅.因此,我们需要一种“只关闭一部分数据交换中使用的流”(Half-cl

Python 网络编程(二)

Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单的仿ssh的socket程序,实现的功能为客户端发送命令,服务端接收到客户端的命令,然后在服务器上通过subrocess模块执行命令,如果命令执行有误,输出内容为空,则返回"command error"的语句给客户端,否则将命令执行的结果返回给客户端 服务端 1 2 3 4 5 6 7 8