使用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实现多用户并发的更多相关文章

  1. python 开发一个支持多用户在线的FTP

    ### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...

  2. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

  3. 这几天有django和python做了一个多用户博客系统(可选择模板)

    这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...

  4. python之tcp自动重连

    操作系统: CentOS 6.9_x64 python语言版本: 2.7.13 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连. 测试服务器示例代 ...

  5. C# ASP.NET B/S模式下,采用lock语法 实现多用户并发产生不重复递增单号的一种解决方法技术参考

    有时候也好奇,若是老外发个技术文章,会不会到处是有人骂街的?进行人身攻击的?中国人喜欢打击别人,不知道老外是不是也是这个性格?好奇的问一下大家. 往往我们在开发程序.调试程序时,无法模拟多用户同时操作 ...

  6. (4)socket的基础使用(基于TCP协议的并发编程)

    需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...

  7. Python 用队列实现多线程并发

    # Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...

  8. oracle多用户并发及事务处理

    多用户并发访问 事务:作用于某些数据的一个不可分割的操作   锁:写锁.互斥锁(仅能被一个进程使用)      读锁.共享锁(可被多个进程使用)   更新丢失 脏读 不可重复读 幻影读   隔离级别: ...

  9. 进程池和线程池、协程、TCP单线程实现并发

    一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...

随机推荐

  1. mysql大于当前时间置顶并按升序排序,小于当前时间的置尾并按降序排序

    现在用id来代替时间这样好测试 看一下测试表数据 执行按需求规则排序的sql SELECT * FROM number_generator ORDER BY id < 16 , IF(id &l ...

  2. String类的使用2

    /*String:字符串,使用一对""引起来表示.1.String声明为final的,不可被继承2.String实现了Serializable接口:表示字符串是支持序列化的. 实现 ...

  3. 对不起,“下一代ERP”仍旧是现在的ERP

    最近数字化转型太火了,到处都是相关数字化的网文.很多人又说在数字化转型时代,ERP早就落伍了云云,取而代之的是什么"下一代ERP",叫什么"ARP"." ...

  4. JavaWeb 补充(JSP&EL&JSTL)

    1. JSP:     1. 指令     2. 注释     3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令     * 作用:用于 ...

  5. BLE链路层状态机初探

    状态机 BLE链路层把所有的功能放到五种不同的状态中,在不同的状态分别执行不同的功能. 一般来说,BLE设备大致有这么几种状态:空闲,广播,扫描,发起连接和连接成功. 广播和扫描是相对应的,一个设备广 ...

  6. Ionic5路由跳转传值复用

    1. 路由技术 ( 详细记录 ) 是笔记不是博文,觉得写的不够详细的可以使用Ctrl + W组合键 路由跳转页面 1. HTML 中使用 routerLink 属性路由进行跳转,传值时使用 query ...

  7. Python数据类型之字符串类型

    字符串的表示 字符串是Python中最常用的数据类型之一,必须使用成对的引号包围来表示字符串,引号可以是单引号 ' .双引号 " .三引号''' """,格式如 ...

  8. Java中的线程池用过吧?来说说你是怎么理解线程池吧?

    前言 Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了.我甚至这次标题都想写成[Java八股文之线程池],但是有点太俗套了.虽然,线程池是一个已经被说烂的知识点了 ...

  9. RING3级下枚举用户进程的基本姿势

    简述 Ring3用户态下查看进程信息的基本方法 代码样例 #include <cstdio> #include <iostream> #include <cstdlib& ...

  10. hdu5247找连续数(打表)

    题意(中问题直接粘题意吧)                                 找连续数 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否 ...