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单线程实现并发
一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...
随机推荐
- Sql Server Report Service访问服务页面503解决方法
这个问题可能性比较多,也有多个方案去解决,可以从如下方法里逐个测试 1.打最新的数据库补丁. 2.删除报表服务配置的密钥,重启报表服务. 3.修改报表服务器配置的用户账户为域管理员 4.找到报表服务器 ...
- 【3.0 递归 Recursion 02】
[递归:阶乘] 1.寻找基本情况 对于阶乘而言,最基本的情况就是0!和1!,二者的结果都是1 我们不妨现在方法中写下这个情况,帮助我们跳出递归 if(i<=1){ return 1 ; } 接下 ...
- 【深度学习】PyTorch CUDA环境配置及安装
Pytorch版本介绍 torch:1.6 CUDA:10.2 cuDNN:8.1.0 安装 NVIDIA 显卡驱动程序 一般 电脑出厂/装完系统 会自动安装显卡驱动 如果有 可直接进行下一步 下载链 ...
- Debian10 安装MyCLI
1 概述 Debian10安装MyCLI. 环境: Debian10 Python3.7 2 准备环境 2.1 Python 首先确保安装了Python: apt install python3 若是 ...
- Fiddler使用 断点 模拟返回 AutoResponder Mock 模拟数据 相关学习记录
断点 测试中有时需要改变发出去的请求信息,需要用到打断点的方法.断点包含两种方式: before response:在request请求的时候,未到达服务器之前,一般用来修改请求参数 after re ...
- JDBC_15_悲观锁和乐观锁
悲观锁和乐观锁 并发控制 当程序中可能出现并发操作的情况时,就需要保证在并发操作的情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和某个用户单独操作时的结果是一样的.这种手段就叫 ...
- CloudIDE:为开发者写代码开启“加速”模式
摘要:华为云CloudIDE,以软件基础技术结合新时代业务场景,给开发者提供更高效.优质的开发体验,帮助开发者实现业务创新新动力,以硬核技术重塑云原生开发生产力. 本文分享自华为云社区<华为云C ...
- C - 抽屉 POJ - 3370 (容斥原理)
Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain ...
- 文件描述符fd
java 后台运行程序命令 nohup java -jar babyshark-0.0.1-SNAPSHOT.jar > log.file 2>&1 & 命令解释:后台启动 ...
- typecho+宝塔搭建
在这个互动视频中很详细的讲解到了 https://www.bilibili.com/video/BV1o4411r7x5?spm_id_from=pageDriver