Python網(wǎng)絡(luò)編程之socketserver實(shí)現(xiàn)多并發(fā)

2018-06-08 17:34 更新

利用socketserver實(shí)現(xiàn)多并發(fā),socketserver內(nèi)部會(huì)調(diào)用socket模塊進(jìn)行功能上的實(shí)現(xiàn)


client.py客戶端腳本文件內(nèi)容

  1. #!/usr/bin/env python

  2. # _*_ coding:utf-8 _*_

  3. import socket

  4. # 創(chuàng)建一個(gè)socket對(duì)象

  5. obj = socket.socket()

  6. # 制定服務(wù)端的IP地址和端口

  7. obj.connect(('127.0.0.1', 999, ))

  8. # 阻塞,等待服務(wù)端發(fā)送內(nèi)容,接受服務(wù)端發(fā)送過來的內(nèi)容,最大接受1024字節(jié)

  9. ret_bytes = obj.recv(1024)

  10. # 因?yàn)榉?wù)端發(fā)送過來的是字節(jié),所以我們需要把字節(jié)轉(zhuǎn)換為字符串進(jìn)行輸出

  11. ret_str = str(ret_bytes, encoding="utf-8")

  12. # 輸出內(nèi)容

  13. print(ret_str)

  14. while True:

  15.    # 當(dāng)進(jìn)入連接的時(shí)候,提示讓用戶輸入內(nèi)容

  16.    inp = input("Client請(qǐng)輸入要發(fā)送的內(nèi)容>>> ")

  17.    # 如果輸出q則退出

  18.    if inp == "q":

  19.        # 把q發(fā)送給服務(wù)端

  20.        obj.sendall(bytes(inp, encoding="utf-8"))

  21.        # 退出當(dāng)前while

  22.        break

  23.    else:

  24.        # 否則就把用戶輸入的內(nèi)容發(fā)送給用戶

  25.        obj.sendall(bytes(inp, encoding="utf-8"))

  26.        # 等待服務(wù)端回答

  27.        print("正在等待Server輸入內(nèi)容......")

  28.        # 獲取服務(wù)端發(fā)送過來的結(jié)果

  29.        ret = str(obj.recv(1024), encoding="utf-8")

  30.        # 輸出結(jié)果

  31.        print(ret)

  32. # 連接完成之后關(guān)閉鏈接

  33. obj.close()

server.py服務(wù)端腳本文件內(nèi)容

  1. #!/usr/bin/env python

  2. # _*_ coding:utf-8 _*_

  3. import socketserver

  4. class MyServer(socketserver.BaseRequestHandler):

  5.    def handle(self):

  6.        conn = self.request

  7.        conn.sendall(bytes("你好,歡迎登陸!", encoding="utf-8"))

  8.        while True:

  9.            # 輸出等待客戶端發(fā)送內(nèi)容

  10.            print("正在等待Client輸入內(nèi)容......")

  11.            # 接收客戶端發(fā)送過來的內(nèi)容

  12.            ret_bytes = conn.recv(1024)

  13.            # 轉(zhuǎn)換成字符串類型

  14.            ret_str = str(ret_bytes, encoding="utf-8")

  15.            # 輸出用戶發(fā)送過來的內(nèi)容

  16.            print(ret_str)

  17.            # 如果用戶輸入的是q

  18.            if ret_str == "q":

  19.                # 則退出循環(huán),等待下個(gè)用戶輸入

  20.                break

  21.            # 給客戶端發(fā)送內(nèi)容

  22.            inp = input("Service請(qǐng)輸入要發(fā)送的內(nèi)容>>> ")

  23.            conn.sendall(bytes(inp, encoding="utf-8"))

  24. if __name__ == "__main__":

  25.    server = socketserver.ThreadingTCPServer(('127.0.0.1', 999, ), MyServer)

  26.    server.serve_forever()

效果圖

socker-04

同時(shí)打開多個(gè)客戶端,服務(wù)端也不會(huì)出現(xiàn)錯(cuò)誤


本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)