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接口 ...
随机推荐
- 大数据实操2 - hadoop集群访问——Hadoop客户端访问、Java API访问
上一篇中介绍了hadoop集群搭建方式,本文介绍集群的访问.集群的访问方式有两种:hadoop客户端访问,Java API访问. 一.集群客户端访问 Hadoop采用C/S架构,可以通过客户端对集群进 ...
- PCIe link up bug 分析
Xilinx两块开发版PCIe link up时间相差很大,Virtex-6开发版PCIe link up时间超过60ms,而Virtex-7 PCIe link up时间只有~25ms. 分析过 ...
- 测H5
如果原文本自带样式,需要测在h5里能否正常展示
- 基于IPv6的数据包抓包分析(GNS3)
一.实验拓扑 二.路由配置 路由R1.R2.R3.R4.R5详细配置: 1.配置R1: R1(config)#interface fastEthernet 0/1 R1(config-if)#ipv6 ...
- vue 增删改查
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- EL表达式、JSTL标签库
一.EL(Expression Language)表达式 语法结构:${var} 若要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true: <%@ pag ...
- iOS.ObjC.__attribute__-directives
__attribute__ Directives Reference 1. __attribute__ directives in Objective-C (AAAA+) (Read Again) h ...
- elementUI表格排序问题
elementUI表格排序: 问题:得不到排序后的数组,每次打印的总是一开始的数据 <el-table ref="passTable" :data="passTab ...
- [并查集][NOIP2015]信息传递
信息传递 题目描述 有 N 个同学( 编号为 1 到 N) 正在玩一个信息传递的游戏. 在游戏里每人都有一个固定的信息传递对象, 其中,编号为i的同学的信息传递对象是编号为ti的同学. 游戏开始时, ...
- git 提交代码操作
1.修改1分支后 git add git commint2.切换到本地分支git checkout local-5.0git remote update 更新远程仓库3.git pull origin ...