039.Python使用TCP实现多用户并发
使用TCP实现多用户并发
在前面的实验中,TCP建立连接时,只能允许一个用户连接,当第二个用户建立连接时,发送的信息,服务端是没有办法接受,只有当第一个用户退出时,才能接受到第二个用户的请求,并实现通信
但是UDP可以实现多用户
1 UDP的多并发
服务端
#服务端
import socket #创建对象 socket.SOCK_DGRAM 代表UDP协议
sk = socket.socket(type=socket.SOCK_DGRAM) #在网络中注册该主机
sk.bind ( ("127.0.0.1",9000) ) #udp服务器,第一次启动时,一定是先接收数据,在发送数据
while True:
msg,cli_addr = sk.recvfrom(1024)
print (msg.decode("utf-8"))
print (cli_addr)
#发送消息
message = input("Please input your vaule>>>:")
sk.sendto(message.encode("utf-8"),cli_addr)
#关闭udp连接
sk.close()
客户端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) #sendto (要发送的消息,(IP地址,端口号))
while True:
message = input("Please input the value:")
sk.sendto (message.encode("utf-8"),("127.0.0.1",9000) )
#接收数据
msg,ser_addr = sk.recvfrom(1024)
print (msg.decode("utf-8"))
#关闭连接
sk.close()
一个client建立连接
[root@node10 tcp]# python3 server.py
Hi,I am the first client
('127.0.0.1', 34937)
Please input your vaule>>>:Hi first client
[root@node10 tcp]# python3 client.py
Please input the value:Hi,I am the first client
Hi first client
再使用一个client连接
三个之间进行通信
服务端
[root@node10 tcp]# python3 server.py
Hi,I am the first client
('127.0.0.1', 44633)
Please input your vaule>>>:Hi first client
Hi
('127.0.0.1', 44633)
Please input your vaule>>>:Hi
Hi,I am the first client2
('127.0.0.1', 56953)
Please input your vaule>>>:Hi,welcome,client 2
thank you
('127.0.0.1', 56953)
Please input your vaule>>>:yes
OK
('127.0.0.1', 44633)
Please input your vaule>>>:ok
第一个clent [root@node10 tcp]# python3 client.py
Please input the value:Hi,I am the first client
Hi first client
Please input the value:Hi
Hi
Please input the value:OK
ok 第二个client
[root@node10 tcp]# python3 client.py
Please input the value:Hi,I am the first client2
Hi,welcome,client 2
Please input the value:thank you
yes
2 调用sockerserver模块
服务端
#服务端
import socketserver
import socket
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
#自定义逻辑
print ("This is tcp funaction") #生成一个对象
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循环调用
server.serve_forever()
客户端
import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9000) )
sk.close()
执行
[root@node10 tcp]# python3 server.py
This is tcp funaction
#这里一直阻塞,等待客户端连接
[root@node10 tcp]# python3 client.py
因为客户端没有循环,执行就直接退出,无法看出并发
3 BaseRequestHandle的底层逻辑
服务端
#服务端
import socketserver
import socket
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
#自定义逻辑
print ("This is tcp funaction")
print (self.request)
print (self.client_address) #生成一个对象
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循环调用
server.serve_forever()
执行
This is tcp funaction
<socket.socket fd=4,
family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM,
proto=0,
laddr=('127.0.0.1', 9000),
raddr=('127.0.0.1', 44428)>
('127.0.0.1', 44428)
4 添加循环不退出
服务端
#服务端
import socketserver
import socket
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
#自定义逻辑
print ("This is tcp funaction")
conn = self.request
while True:
msg = conn.recv(1024)
print(msg.decode("utf8"))
conn.send(b"world")
#生成一个对象
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000),MyServer ) #循环调用
server.serve_forever()
客户端
import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9000) )
while True:
# 发消息
sk.send(b"hello") # 接收服务器消息
msg = sk.recv(1024)
print(msg.decode("utf-8"))
sk.close()
执行服务端,然后开启三个客户端
结果如下
多并发已经完成
039.Python使用TCP实现多用户并发的更多相关文章
- python 开发一个支持多用户在线的FTP
### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...
- java 26 - 9 网络编程之 TCP协议多用户上传文件
TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...
- 这几天有django和python做了一个多用户博客系统(可选择模板)
这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...
- python之tcp自动重连
操作系统: CentOS 6.9_x64 python语言版本: 2.7.13 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连. 测试服务器示例代 ...
- C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考
有时候也好奇,若是老外发个技术文章,会不会到处是有人骂街的?进行人身攻击的?中国人喜欢打击别人,不知道老外是不是也是这个性格?好奇的问一下大家. 往往我们在开发程序.调试程序时,无法模拟多用户同时操作 ...
- (4)socket的基础使用(基于TCP协议的并发编程)
需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...
- Python 用队列实现多线程并发
# Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...
- oracle多用户并发及事务处理
多用户并发访问 事务:作用于某些数据的一个不可分割的操作 锁:写锁.互斥锁(仅能被一个进程使用) 读锁.共享锁(可被多个进程使用) 更新丢失 脏读 不可重复读 幻影读 隔离级别: ...
- 进程池和线程池、协程、TCP单线程实现并发
一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...
随机推荐
- JS基础学习第四天
对象(Object) 对象是JS中的引用数据类型对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性使用typeof检查一个对象时,会返回object 对象的分类: 1.内建对象- 由ES标 ...
- JS基础学习第三天
条件分支语句switch语句语法: 1234567891011121314 switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; c ...
- leetcode 783 二叉搜索树节点最小距离
PS:(感觉这题名字和内容有歧义) 要求得到任意不同节点值之间的最小差值. 本身二叉树是有序的,又找最小差值,其实就是相当于在一个有序数组中找到每相邻两数之间最小差值. 朴素思想: 中序遍历树,把值都 ...
- 「HTML+CSS」--自定义加载动画【015】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- 使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神
使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神 前言 接上一篇 使用 EPPlus 封装的 excel 表格导入功能 (一) 前一篇的是大概能用但是 ...
- 自动化kolla-ansible部署centos7.9+openstack-train-超融合高可用架构
自动化kolla-ansible部署centos7.9+openstack-train-超融合高可用架构 欢迎加QQ群:1026880196 进行交流学习 环境说明: 1. 满足一台电脑一个网卡的环境 ...
- mysql 遇到的问题
1) 客户端(Navicat)远程登录操作再遇问题1142-create command denied to user×××的解决GRANT SELECT,INSERT,UPDATE,DELETE,C ...
- python对BP神经网络实现
python对BP神经网络实现 一.概念理解 开始之前首先了解一下BP神经网络,BP的英文是back propagationd的意思,它是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称 ...
- Python 并行计算那点事 -- 译文 [原创]
Python 并行计算的那点事1(The Python Concurrency Story) 英文原文:https://powerfulpython.com/blog/python-concurren ...
- MSSQL数据库清理Log 压缩数据库日志文件
dump transaction 数据库名 with no_log go dbcc shrinkdatabase(数据库名)