1. 程式人生 > >一個簡單的基於多進程實現並發的Socket程序

一個簡單的基於多進程實現並發的Socket程序

sta 多進程並發 成對 int star open AS NPU .py

  在單進程的socket的程序的基礎上,實現多進程並發效果的思路具體是:在server端開啟“鏈接循環”,每建立一次鏈接就生成一個Process對象進行server-client的互動,而client端不用做任何變化,因為對於client來說每運行一次程序就相當於與server端建立了一個鏈接。

  具體代碼如下:

技術分享圖片
# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket
import os
from multiprocessing import Process

#多進程開啟的程序
def talk(conn):
    
# 通信循環 while 1: try: data = conn.recv(1024) if not data: break print(client <%s> data:%s %(os.getpid(),data.decode(utf-8))) conn.send(data.upper()) except ConnectionResetError: break conn.close()
#socket建立連接循環的程序 def server(ip,port): whw_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) whw_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) whw_server.bind((ip,port)) whw_server.listen(5) # 鏈接循環 while 1: conn, addr = whw_server.accept()
#生成對象,每建立一個鏈接就啟動一個進程 p = Process(target=talk,args=(conn,)) p.start() if __name__ == __main__: server(127.0.0.1,9000)
Server.py 技術分享圖片
# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import socket

whw_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_client.connect((127.0.0.1,9000))

while 1:
    msg = input(>>>:).strip()
    if not msg:
        continue
    whw_client.send(msg.encode(utf-8))
    data = whw_client.recv(1024)
    print(Server Data:,data.decode(utf-8))
Client.py

  運行效果如下:

技術分享圖片

  如上圖所示:我們可以看到不同進程(由ID標識)的client與server的交互過程~

一個簡單的基於多進程實現並發的Socket程序