1. 程式人生 > >Python3:利用Socket實現多使用者實時聊天.

Python3:利用Socket實現多使用者實時聊天.

我們繼續在用程式碼演示Socket和Server 實現通訊 這個章節繼續擴充套件

首先我們要做到的是 實時通訊,
這裡面牽扯了3個知識點:

  1. 既然是實時通訊,必須是用input線上輸入
  2. 我們要把close 語句刪除,否則會自己斷掉
  3. 為了達到實時通訊,必須不斷的迴圈 用while 語句就行.
    現在我們來實現吧
    這個是客戶端的程式碼
import  socket

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8000))
while True:         #呼叫了while迴圈並且是True代表永遠不會斷開
    a=input()       #呼叫了input 語句  
    client.send(a.encode("utf-8"))
    # 客戶端socket 傳送資料給服務端
    data = client.recv(1024)
    # 接受的資料
    print(data.decode("utf8"))

服務端的程式碼:

import  socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",8000))


server.listen()
sock,addr=server.accept()
while True:        #呼叫了while迴圈並且是True代表永遠不會斷開
    data = sock.recv(1024)
    print(data.decode("utf-8"))
    a=input("")          #呼叫了input 語句  
    sock.send(a.encode("utf8"))
  

實時通訊我們已經完成,
下邊就是 如何達到多客戶端的通訊,這裡用到了多執行緒的知識

多執行緒看下就好,我不做解釋,後邊的章節我會詳細的介紹 .

服務端程式碼如下 :

import  socket
import threading

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",8000))
server.listen()

def handle_sock(sock,addr):   #sock 的流程
    while True:      
        data = sock.recv(1024)
        b=data.decode("utf-8")
        print(data.decode("utf-8"))
        a = input("")
        sock.send(a.encode("utf8"))


while True:       
    sock, addr = server.accept()     #接受不同client 端的sock .
    client_thread=threading.Thread(target=handle_sock,args=(sock,addr))  #把sock 加入執行緒內
    client_thread.start()  #啟動執行緒

我們可以試試下,我們可以啟動兩個client.

我試過了是可以行的通的,大家可以試試 ,不明白的地方在下邊給我留言 ,謝謝
我都寫好了剛才有小夥伴問我如何退出client呢 ?我在這補充下

在這裡我把程式碼附上去,都是很簡單,自己可以理解下:

import  socket
import threading

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",8000))


server.listen()

def handle_sock(sock,addr):
    while True:
        data = sock.recv(1024)
        b=data.decode("utf-8")

        print(data.decode("utf-8"))
        if b=="exit":
            break
        a = input("")
        sock.send(a.encode("utf8"))
    sock.close()

while True:
    sock, addr = server.accept()
    client_thread=threading.Thread(target=handle_sock,args=(sock,addr))
    client_thread.start()