python多线程socket编程之多客户端接入
作者:Lockeyi 时间:2021-01-26 10:14:52
Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务
端用有很多模块可以使用,如下:
1、客户端
#!/usr/bin/env python
#coding:utf-8
'''
file:client.py
date:9/9/17 3:43 PM
author:lockey
email:lockey@123.com
desc:socket编程客户端,python3.6.2
'''
import socket,sys
HOST = '192.168.1.6'
PORT = 8998
ADDR =(HOST,PORT)
BUFSIZE = 1024
sock = socket.socket()
try:
sock.connect(ADDR)
print('have connected with server')
while True:
data = input('lockey# ')
if len(data)>0:
print('send:',data)
sock.sendall(data.encode('utf-8')) #不要用send()
recv_data = sock.recv(BUFSIZE)
print('receive:',recv_data.decode('utf-8'))
else:
sock.close()
break
except Exception:
print('error')
sock.close()
sys.exit()
2、SocketServer模块
为了能够让多个客户端同时接入服务并进行通信,服务端将使用SocketServer模块来实现,这样的话用户不用在子线程结束后,利用父进程对它进行处理,也不用关心socket的关闭,一切都由SocketServer来完成。
#!/usr/bin/env python
#coding:utf-8
'''
file:client.py
date:9/9/17 3:43 PM
author:lockey
email:lockey@123.com
desc:socket编程服务器端,python3.6.2
'''
from socketserver import BaseRequestHandler,ThreadingTCPServer
import threading
BUF_SIZE=1024
class Handler(BaseRequestHandler):
def handle(self):
address,pid = self.client_address
print('%s connected!'%address)
while True:
data = self.request.recv(BUF_SIZE)
if len(data)>0:
print('receive=',data.decode('utf-8'))
cur_thread = threading.current_thread()
#response = '{}:{}'.format(cur_thread.ident,data)
self.request.sendall('response'.encode('utf-8'))
print('send:','response')
else:
print('close')
break
if __name__ == '__main__':
HOST = '192.168.1.6'
PORT = 8998
ADDR = (HOST,PORT)
server = ThreadingTCPServer(ADDR,Handler) #参数为监听地址和已建立连接的处理类
print('listening')
server.serve_forever() #监听,建立好TCP连接后,为该连接创建新的socket和线程,并由处理类中的handle方法处理
print(server)
以下测试中我使用另外一台主机和本机的两个中断去连接服务器,都可以正常连接并且能进行数据应答交互
注意:此程序示例运行平台为rhel7.2.x86_64,python版本为3.6.2,对于windows平台和非同一python版本的用户可能缺乏一定的兼容性,如果是其他平台用户请自行修正!!
来源:http://blog.csdn.net/lockey23/article/details/77915769
标签:python,多线程,socket
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
纯CSS3文字渐变内发光投影效果
2011-08-24 20:15:10
用javascript实现给出的盒子的序列是否可连为一矩型
2023-09-09 22:34:02
![](https://img.aspxhome.com/file/2023/0/56100_0s.jpg)
Mysql的服务无法启动的1067错误解决
2012-01-05 19:31:56
asp超强的Server Application Error 的解决方法
2008-11-13 13:04:00
关于生成目录树结构的类
2007-09-13 12:19:00
如何创建CSS的对象,获取合适的粒度
2010-07-09 13:10:00
![](https://img.aspxhome.com/file/UploadPic/20107/9/02-19s.jpg)
JavaScript奇怪的比较——隐式类型转换
2009-02-15 13:06:00
asp查询xml的代码 不刷新页面查询的方法
2011-04-06 11:00:00
php通过隐藏表单控件获取到前两个页面的url
2023-11-16 04:00:08
![](https://img.aspxhome.com/file/2023/5/102105_0s.gif)
python从入门到精通(DAY 3)
2023-11-03 08:23:18
![](https://img.aspxhome.com/file/2023/8/63598_0s.png)
sqlserver 脚本和批处理指令小结
2012-05-22 18:56:55
jQuery中$.ajax的实现解析
2008-07-20 13:11:00
Go语言struct要使用 tags的原因解析
2023-08-31 09:25:19
![](https://img.aspxhome.com/file/2023/6/93666_0s.jpg)
仿淘宝星级评分效果
2010-09-03 18:37:00
使用Python实现从各个子文件夹中复制指定文件的方法
2023-11-09 12:04:05
基于OpenCV(python)的实现文本分割之垂直投影法
2023-11-17 08:45:39
![](https://img.aspxhome.com/file/2023/9/64319_0s.png)
网站导航设计的6大分类
2010-07-12 18:46:00
![](https://img.aspxhome.com/file/UploadPic/20107/12/01-25s.jpg)
使用:after清除浮动
2008-10-30 12:10:00
如何动态产生变量?
2009-11-18 16:33:00
混乱的标记语言XHTML2/HTML5
2009-07-31 14:27:00
![](https://img.aspxhome.com/file/UploadPic/20097/31/200973114466783s.jpg)