系列文章目录
Python Socket 编程详细介绍
前言
之前学习了只用python中的socket模块编程TCP客户端和服务端,本章加入threading模块对服务端进行多线程处理。
一、threading模块
threading 模块中最核心的内容是 Thread 这个类。
创建Thread对象,然后运行起来,每个Thread对象代表一个线程,每个线程可以处理不同的任务,这就是多线程编程。值得注意的是,程序运行时默认就是在主线程上。
创建Thread对象有两种方法:
1.直接创建Thread,然后将一个callable 对象从类的构造器中传递回去,这个callable就是回调函数,用来处理任务。 2.编写一个自定义类继承 Thread,然后复写 run() 方法,在 run() 方法中编写任务处理代码,然后创建这个 Thread 的子类。
下面用种方法直接创建 Thread 对象。
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
Thread构造的方法中target所以我们需要将一个callable对象赋值给它,args这是固定参数,kwargs是可变参数。
二、threading代码示例
1.引入库
import threading
在主程序打印5次,在子程序打印5次 代码如下(示例):
#在主程序打印5次,在子程序打印5次
import threading
import time
def call():
for i in range(5):
print('hu ',i)
time.sleep(1)
thread = threading.Thread(target=call)
thread.start()
for i in range(5):
print('main ', i)
time.sleep(1)
运行结果如下:
hu 0
tu 0
hu 1
tu 1
hu 2
tu 2
hu 3
tu 3
hu 4
tu 4
每一个 Thread 都有name 的属性,代表的就是线程的名字,这个可以在构造方法中赋值。 如果在构造方法中没有个 name 赋值的话,默认就是 “Thread-N” 的形式,N 是数字。
三、 TCP服务端
import socket #Socket 它提供了标准的BSD Socket API
import threading #threading 多线程
bind_ip = "0.0.0.0"
bind_port = 555
#创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定套接字地址
server.bind((bind_ip,bind_port))
server.listen(5) #最大连接5
print("[*] Listening on {0}:{1}".format(bind_ip,bind_port))
#客户处理线程
def handle_client(client_socket):
request = client_socket.recv(4096).decode()#打印出客户端发送得到内容
print("[*] Received :",request)
client_socket.send("ACK!".encode())
client_socket.close()
while True:
client,adder = server.accept()
print("[*] Accepted connection from {0}:{1}".format(adder[0],adder[1]))
#挂起客户端线程,处理传入的数据
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()
总结
这篇文章主要学习对TCP服务端的编写,简单介绍了threading模块。想要深入学习theading模块可以去 https://blog.csdn.net/briblue/article/details/85101144
|