python网络编程 双人多人聊天
在学习网路编程时,我们首先要考虑的是其中的逻辑,我们借助打电话的形式来了解网络编程的过程,
我们打电话时属于呼叫方,接电话的属于被呼叫方,那么被呼叫方一直保持在待机状态,等待主呼叫方
呼叫,只有在被呼叫方接听时双方才可以正常通话。那网络编程逻辑也是如此,在此之前我要调用
import socket
import threading 双人聊天
1.被呼叫方:
创建服务套接字≥
服务套接字绑定主机绑定端口号≥
建立最大的连接数>
接收客户套接字>
线程阻塞>
发送信息
import socket
import threading
serverrsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serverrsocket.bind(("192.168.66.180",9999))
print('绑定端口和主机')
serverrsocket.listen(5)
print('开始接收客户请求')
c=serverrsocket.accept()#线程阻塞
print("有一个客户请求")
# msg=c[0].recv(1024)#1024是发送大小
# print(msg.decode())#接收的数据要解码
# c[0].send("dong".decode())
def myrevc(c):
while True:
msg=c.recv(1024)#阻塞
print(msg.decode())
threading._start_new_thread(myrevc,(c[0],))
while True:
msg=input()
c[0].send(msg.encode())
2.主呼叫方:
建立客户套接字》
send发送的数据要编码》
阻塞
import socket
import threading
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("创建客户套接字")
c.connect(('192.168.66.180',9999))
print("我联机到服务")
#send发送的数据要编码
# c.send("who are you".encode())
# msg=c.recv(1024)
# print(msg.decode())
def myrevc(c):
while True:
msg=c.recv(1024)#阻塞
print(msg.decode())
threading._start_new_thread(myrevc,(c,))
while True:
msg=input()
c.send(msg.encode())
多人聊天:
1.实现多人聊天也就不存在被呼叫方了,原理是多个主呼叫方把消息一个地方,在返回给各个呼叫方,这时候由于多个用户同时进行
于是我们要开启多个线程。
import threading
import socket
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ss.bind('0.0.0.0',9999)
ss.listen(10)
msg=None
lock1=threading.Lock()
con=threading.Condition(lock1)
def server_recv(c,a):
while True:
global msg
while True:
str1=c.recv(1024)
con.acquire
msg=str1
msg=str(a)+str1.decode()
con.notify_all()
con.release()
def server_send(c,a):
global msg
while True:
con.acquire()
con.wait()
con.release()
con.send(msg.encode()) while True:
c,a=ss.accept()
threading._start_new_thread(server_recv,(c,a))
threading._start_new_thread(server_send,(c,a))
python网络编程 双人多人聊天的更多相关文章
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- 28、Python网络编程
一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...
- Python网络编程04 /recv工作原理、展示收发问题、粘包现象
Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...
- Python网络编程03 /缓存区、基于TCP的socket循环通信、执行远程命令、socketserver通信
Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命令.socketserver通信 目录 Python网络编程03 /缓存区.基于TCP的socket循环通信.执行远程命 ...
- python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术
python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
随机推荐
- Java反转二叉树
// 二叉树节点定义 public class BinaryTreefanzhuan { class TreeNode{ int value; TreeNode left; TreeNode righ ...
- 网站图片的轮播JS代码
这是几个网站的轮播JS效果,实现图片按照时间来切换,目前有几个站实现该功能,特别是浴室柜网站改版前,以下就是JS具体内容可以自己改下路径就可以用的linkarr = new Array();picar ...
- Vue数据交互
注意:本地json文件必须放在static目录下面,读取或交互数据前,请先安装vue-resource.点击前往 -->(vue-resource中文文档) 一.Vue读取本地JSON数据 c ...
- AD16PCB如何快速删除走线
工具(Tools)取消布线(Un_Route)全部(AII) ad pcb画图,如果想整体去掉一条线,只要是连接在一起的,不管在哪一层,都可以采取如下方法:1.PCB画面下,按组合键Ctrl+H,会出 ...
- shell脚本简介
什么是shell? shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户.这种对话方式可以是交互的 ...
- 关于iOS刷新UI需要在主线程执行
为什么一定要在主线程刷新UI? 安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有可能出现资源抢夺,导致问题. 其实:在子线程是不能更新UI的, 看到能更新的结果只是个假象 ...
- Loadrunner 11.00录制App脚本篇(Win10)
参考博文1:https://www.cnblogs.com/mxqh2016/p/6016866.html 参考博文2:https://blog.csdn.net/myohmy2008/article ...
- Centos7下面配置客户端OpenVPN
安装 openvpn yum install -y openvpn vim 配置默认的 daemon 文件 vim /usr/lib/systemd/system/openvpn@.service [ ...
- Rappid 消除试用版的弹出框
今天想学习JavaScript的FlowCharts,发现有个Rappid库挺不错的(如下图2所示),下了一个后发现在打开窗口时总是要弹出一个提示框,这严重影响了学习的进度,于是相办法将其去掉吧,按照 ...
- go的包下载失败解决方案
包被墙的方案 1 翻啊的墙 2 gopm 3 https://github.com/golang/net 4 使用国内网站打包 5 export GOPROXY=https://goproxy.io