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))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM