在学习网路编程时,我们首先要考虑的是其中的逻辑,我们借助打电话的形式来了解网络编程的过程,
我们打电话时属于呼叫方,接电话的属于被呼叫方,那么被呼叫方一直保持在待机状态,等待主呼叫方
呼叫,只有在被呼叫方接听时双方才可以正常通话。那网络编程逻辑也是如此,在此之前我要调用
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))