1. 程式人生 > 實用技巧 >python socket通訊

python socket通訊

socket是一個模組, 又稱套接字,用來封裝 網際網路協議(應用層以下的層)。

socket可以實現網際網路協議 應用層以下的層 的工作,提高開發效率。

'''
client.py啟動服務端後再啟動客戶端
'''
import socket

#1.買手機
client = socket.socket()  #拿到一個手機物件

#2.撥號
client.connect(('127.0.0.1',9527))  #客戶端的ip和port必須與伺服器一致

print('client is running')
#3.通訊迴圈
#講話給對方聽
while True:

    send_data 
= input('客戶端>>>:') client.send(send_data.encode('utf-8')) #只能發bytes型別 data = client.recv(1024) if data.decode('utf-8') == 'q': break if len(data) == 0: break print(data.decode('utf-8')) #4.斷開連線 client.close()
'''
server.py先啟動套接字服務端
注意:
    客戶端傳送一次訊息,服務端就得接受一次,再發送訊息。
''' import socket #1.買手機 server = socket.socket() #拿到一個手機物件 # print(server) # server是用來收發連結請求,建立連結 #2.綁手機卡 server.bind(('127.0.0.1',9527)) #0-65535 #本地迴環地址 ---》'127.0.0.1' #3.開機(半連線池) server.listen(5) #同一時刻,最大請求數為5個 實際==6 print('sever is running') #4.等待電話請求 #conn:指的是服務端往客戶端的管道 #conn,addr = server.accept() #(雙向連線的套接字物件,存放客戶端IP和埠的小元組)
# print(conn) #conn代表雙向連結,用來收發連結 #5.迴圈實現可接受多個使用者訪問 while True: #等待電話接入 --->接入客戶端 # conn: 指的是服務端往客戶端的管道 conn,addr = server.accpt() print(addr) #實現迴圈通訊 while True: try: #監聽程式碼塊是否有異常出現 # 接受對方講話的內容 # data --->客戶端傳送過來的訊息 data = conn.recv(1024) #1024接受的最大位元組數bytes if len(data) == 0: break if data.decode('utf-8') == 'q': break print(data.decode('utf-8')) send_data = input('伺服器>>>:') #伺服器往客戶端傳送訊息 conn.send(send_data.encode('utf-8')) # 捕獲異常資訊,並列印 # e: 報錯資訊 except Exception as e: print(e) break #6.掛電話連線 conn.close()

併發實現套接字通訊

import socket
#client
client = socket.socket()
client.connect(('127.0.0.1',9500))
print('Client is running')
while True:
    msg = input('客戶端:').encode('utf-8')
    client.send(msg)
    data = client.recv(1024)
    print(data)
import socket
from threading import Thread
#server
#封裝成函式
def communicate(conn):
    while True: #通訊迴圈
        try:
            data = conn.recv(1024)
            if len(data) == 0:
                break
            print(data.decode('utf-8'))
            conn.send('好啊'.encode('utf-8'))
        except Exception as e:
            print(e)
            break
    conn.close()

def server(backlog=5):
    server = socket.socket()
    server.bind(('127.0.0.1',9500))
    server.listen(backlog)
    while True:  #連結迴圈
        conn,addr = server.accept()
        print(addr)
        t = Thread(target=communicate,args=(conn,))
        t.start()

if __name__ == '__main__':
    t = Thread(target=server)
    t.start()

版本二:半連線池版

import socket
#client
client = socket.socket()
client.connect(('127.0.0.1',9500))
print('Client is running')
while True:
    msg = input('客戶端:').encode('utf-8')
    client.send(msg)
    data = client.recv(1024)
    print(data)
import socket
from concurrent.futures import ThreadPoolExecutor

server = socket.socket()
server.bind(('127.0.0.1',9500))
server.listen(5)

#封裝成一個函式
def run(conn):
    while True:
        try:
            data = conn.recv(1024)
            if len(data) == 0:
                break
            print(data.decode('utf-8'))
            conn.send('好啊'.encode('utf-8'))
        except Exception as e:
            print(e)
            break
    conn.close()
if __name__ == '__main__':
    print('Server is running')
    pool = ThreadPoolExecutor(100)
    while True:
        conn,addr = server.accept()
        pool.submit(run,conn)