赵走x博客
网站访问量:151533
首页
书籍
软件
工具
古诗词
搜索
登录
11、mac使用Django连接Mysql报错:_mysql.cpython-37m-darwin.so Reason: image not found
10、pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?
9、Python3 celery requests 中文乱码 UnicodeEncodeError: 'latin-1' codec can't encode characters in position
8、Python3之socket编程--2:基于TCP的套接字
Anaconda 入门
Can't find model 'en'
Jupyter Notebook 简单安装
pycharm运行matplotlib出现ValueError: max() arg is an empty sequence问题
pygmo 找不到安装包问题
1、pycharm 程序一直测试状态下运行
graphviz . NotADirectoryError: [Errno 20] Not a directory: 'dot'
image not found
sklearn无法加载fetch_mldata解决方案
MongoDB 坐标_距离
cv2.imread 总为None
vs code: Class 'Activity' has no 'objects' memberpylint(no-member)
AbortedError: Operation received an exception:Status
1、部署人工智能项目:YangZeyu95
pip安装加速
nltk语料库路径设置
No module named 'pymysql'
linux服务器报错—UnicodeEncodeError 'ascii' codec can't encode characters in position 0-1
DevToolsActivePort file doesn't exist.
linux Message: unknown error: unable to discover open pages
Python爬虫:常用的浏览器请求头User-Agent
ModuleNotFoundError: No module named 'MySQLdb'
mac下解决matplotlib乱码的问题
Flask 运行跨域
mongoengine 判断ObjectID 字段是否存在
python下使用pip freeze >requirements.txt命令迁移模块
Python爬取百度,返回 安全认证
flask-migrate 修改 sqlite的表头,sqlite3.OperationalError: near "DROP": syntax error
pip 安装提示超时
8、Python3之socket编程--2:基于TCP的套接字
资源编号:76286
Python 相关Bug
Python
热度:119
文章来自:https://www.cnblogs.com/zhangyingai/p/7097922.html
# 五、基于TCP的套接字 ### tcp服务端 ``` ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听链接 inf_loop: #服务器无限循环 cs = ss.accept() #接受客户端链接 comm_loop: #通讯循环 cs.recv()/cs.send() #对话(接收与发送) cs.close() #关闭客户端套接字 ss.close() #关闭服务器套接字(可选) ``` ### tcp客户端 ``` cs = socket() # 创建客户套接字 cs.connect() # 尝试连接服务器 comm_loop: # 通讯循环 cs.send()/cs.recv() # 对话(发送/接收) cs.close() # 关闭客户套接字 ``` socket通信流程与打电话流程类似,我们就以打电话为例来实现一个low版的套接字通信 ### 服务端 ``` import socket ip_port=('127.0.0.1',9000) #电话卡 BUFSIZE=1024 #收发消息的尺寸 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 s.bind(ip_port) #手机插卡 s.listen(5) #手机待机 conn,addr=s.accept() #手机接电话 # print(conn) # print(addr) print('接到来自%s的电话' %addr[0]) msg=conn.recv(BUFSIZE) #听消息,听话 print(msg,type(msg)) conn.send(msg.upper()) #发消息,说话 conn.close() #挂电话 s.close() #手机关机 ``` 客户端 ``` import socket ip_port=('127.0.0.1',9000) BUFSIZE=1024 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect_ex(ip_port) #拨电话 s.send('nitouxiang nb'.encode('utf-8')) #发消息,说话(只能发送字节类型) feedback=s.recv(BUFSIZE) #收消息,听话 print(feedback.decode('utf-8')) s.close() #挂电话 ``` 服务端 输出 ``` 接到来自127.0.0.1的电话 b'nitouxiang nb'
``` 客户端 输出 ``` NITOUXIANG NB ``` 上述流程的问题是,服务端只能接受一次链接,然后就彻底关闭掉了,实际情况应该是,服务端不断接受链接,然后循环通信,通信完毕后只关闭链接,服务器能够继续接收下一次链接,下面是修改版 ### 服务端 ``` import socket ip_port = ('127.0.0.1',8081) #电话卡 BUFSIZE=1024 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 s.bind(ip_port) #手机插卡 s.listen(5) #手机待机 while True: #新增接收链接循环,可以不停的接电话 conn,addr=s.accept() #手机接电话 print('接到来自%s的电话' %addr[0]) while True: ##新增通信循环,可以不断的通信,收发消息 msg=conn.recv(BUFSIZE) #听消息,听话 if len(msg) == 0:break #如果不加,那么正在链接的客户端突然断开,recv便不再阻塞,死循环发生 print(msg,type(msg)) conn.send(msg.upper()) #发消息,说话 conn.close() #挂电话 s.close() #手机关机 ``` ### 客户端 ``` import socket ip_port=('127.0.0.1',8081) BUFSIZE=1024 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect_ex(ip_port) #拨电话 while True: #新增通信循环,客户端可以不断发收消息 msg=input('>>: ').strip() if len(msg) == 0:continue s.send(msg.encode('utf-8')) #发消息,说话(只能发送字节类型) feedback=s.recv(BUFSIZE) #收消息,听话 print(feedback.decode('utf-8')) s.close() #挂电话 ``` ### 补充: 在重启服务端时可能会遇到  这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法). ### 解决办法 * 方法一 ``` #加入一条socket配置,重用ip和端口 phone=socket(AF_INET,SOCK_STREAM) phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 phone.bind(('127.0.0.1',8080)) ``` 方法二 ``` 发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决, vi /etc/sysctl.conf 编辑文件,加入以下内容: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 然后执行 /sbin/sysctl -p 让参数生效。 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间 ```