在學習網路編程時,我們首先要考慮的是其中的邏輯,我們借助打電話的形式來了解網絡編程的過程,
我們打電話時屬於呼叫方,接電話的屬於被呼叫方,那么被呼叫方一直保持在待機狀態,等待主呼叫方
呼叫,只有在被呼叫方接聽時雙方才可以正常通話。那網絡編程邏輯也是如此,在此之前我要調用
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))