多進程並發socket通信


實現多個客戶端同時接入server端,並且可以同時向客戶端發送信息

server端

def dunc(conn,client_addr):
    while True:
        data=conn.recv(1024)
        print(data,client_addr)
        if data.decode('utf8')=='nihao':
            conn.send('我一點都不好'.encode('utf8'))
        elif data.decode('utf8')=='chifanma':
            conn.send('去吃什么?'.encode('utf8'))
        else:
            conn.send(data.upper())


if __name__ == '__main__':
    import socket
    from multiprocessing import Process

    server=socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen()
    print('start...')
    while True:
        conn,client_addr=server.accept()
        p=Process(target=dunc,args=(conn,client_addr))
        p.start()

client端

import socket

client=socket.socket()
client.connect(('127.0.0.1',8080))

while True:
    msg=input('請輸入你要發送的信息:')
    if not msg:
        continue
    client.send(msg.encode('utf-8'))
    data=client.recv(1024)
    print(data.decode('utf-8'))

需要注意的是:1. 根據TCP內部算法,發送端發送內容為空的時候,不會發送,但是會往下執行;接收端則會一直卡在recv處;所以需要進行一個是否為空的判斷。
2. 客戶端的listen(5),參數(5)的意思是允許的最大半連接數;半連接數的意思是,沒有完成TCP的第三次握手;
產生了半連接的情況:1. 服務器忙不過來,應該提升服務器的性能
2. 洪水攻擊,指的是有許多的客戶端處於半連接,沒有返回第三次握手信息,占用系統的資源


免責聲明!

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



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