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))
浙公网安备 33010602011771号