1. 程式人生 > >socket編程之多客服端(簡易版)

socket編程之多客服端(簡易版)

com true 需要 客戶 返回值 block list sock all

服務端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import sys
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.bind((‘127.0.0.1‘,8080))
sk.listen(5)

while True:              #讓服務端不停接受客戶端
    print("開始接受請求!")
    conn,addr=sk.accept()       
    while True:
        try:             #這裏是為了防止當某一個客戶端斷開後的異常導致服務端停止
            msg=conn.recv(1024).decode()
            if msg == "exit":
               sys.exit("進程通訊結束!")
            conn.sendall("服務器端已收到消息!".encode())
            print("來自%s向你發送了:%s" %(addr,msg))
        except Exception:
            break
    conn.close()

客戶端1:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect((‘127.0.0.1‘,8080))
while True:
    inp=input("請輸入要發送給服務端的消息:")
    if not inp:
        continue
    if inp == "exit":
        break
    sk.sendall(inp.encode())
    print("數據已發送成功等待返回數據")
    msg=sk.recv(1024).decode()
    print(msg)

sk.close()

客戶端2:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect((‘127.0.0.1‘,8080))
while True:
    inp=input("請輸入要發送給服務端的消息:")
    if not inp:
        continue
    if inp == "exit":
        break
    sk.sendall(inp.encode())
    print("數據已發送成功等待返回數據")
    msg=sk.recv(1024).decode()
    print(msg)

sk.close()

註釋:我們在最前面學習了單客戶端方式,但有一個問題當客服端斷開的時服務端也會被斷開,但這不是我們想要的效果,我們希望的服務是希望多客服端和不間斷服務,不能因為一個客服端斷開就停止服務。所以我們修改一下服務端,讓服務端不停的接受客戶端連接。這個時候當兩個客戶端一起發消息的時候只有一個客服端能得到服務端返回數據,另外一個客戶端則需要等待第一個客戶端連接斷開後才能收到服務端的返回值。

技術分享圖片

技術分享圖片

技術分享圖片

socket編程之多客服端(簡易版)