socket 簡單通訊

2021-10-09 03:59:47 字數 2153 閱讀 5420

服務端:

1.建立乙個服務端:

import socket

phone = socket.socket()

###括號內不輸入,預設為family = addressfamily.af_inet

type = socketkind.sock_stream

proto = 0

2.為服務端建立ip位址及埠號

phone.bind((『127.0.0.1』,8080))

###ip位址應為服務端ip,127.0.0.1是本地回環位址

3.為服務端建立半鏈結池

phone.listen(5)

###括號內是半鏈結池內的個數

4.等待接收客戶端的鏈結

conn,client_address = phone.accept()

###conn為tcp協議中的雙層鏈結,client_address 是客戶端ip位址及埠

5.收發訊息

data = conn.recv(1024) ### 括號內是單次最多接收的字元數

print(『收到客戶端資訊:』,data.decode(『utf-8』)) ###客戶端傳過來的是二進位制,需要解碼

conn.send(『要發給客戶端的字元』.encode(『utf-8』)) ###傳送給客戶端也需要編碼成二進位制

6.關閉

conn.close()

phone.close()

客戶端:

1.建立乙個客戶端

phone = socket.socket()

2.與服務端建立鏈結

phone.connet((『127.0.0.1』,8080))

3.發/收訊息

phone.send(『你好』.encode(『utf-8』))

data = phone.recv(1024)

print(『服務端發來的資訊:』,data.decode(『utf-8』))

4.關閉

phone.close()

在通話中,並不是接收一次資訊就直接關閉的,故需要加上迴圈,讓其不被關閉,服務端需要在第4,5步加入while true迴圈,客戶端在第三步加入while true迴圈.

另乙個問題,加好迴圈後,服務端預設conn鏈結已經建好了,若客戶端突然非正常的關閉,如斷網等,服務端就會報錯,

connectionreseterror: [winerror 10054] 遠端主機強迫關閉了乙個現有的連線。此時就需要新增乙個異常處理

異常處理時,在windows系統中,用try…except…在linux系統中,用if len(data) == 0:break即可

服務端格式:

import socket

phone = socket.socket()

phone.bind(('127.0.0.1',8080))

phone.listen(5)

while true:

conn, addr = phone.accept()

while true:

try:

data = conn.recv(1024)

print('接收到%s資訊:'%addr[0],data.decode('utf-8'))

conn.send('資訊已收到'.encode('utf-8'))

except exception:

break

conn.close()

phone.close()

要使客戶端發的資訊讓服務端執行系統命令,需要用到subprocess模組

obj = subprocess.popen(data.decode(『utf-8』),

shell=true,

stdout=subprocess.pipe,

stderr=subprocess.pipe

)res=obj.stdout.read()+obj.stderr.read()

解析:客戶端將二進位制data傳入服務端,服務端呼叫subprocess模組,先將data解碼成原格式,shell= true 是輸入shell中執行,將執行正確的結果存為stdout ,將執行錯誤的結果存為stderr,返回稱為obj物件,res 是執行失敗還有成功的結果(gbk編碼)

此時,傳回客戶端的資訊是gbk編譯的,所以解碼也需要gbk

簡單Socket通訊

示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊 這裡只是乙個簡單的示例,是乙個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。下面是示例程式的簡單步驟說明 伺服器端 第一步 用指定的埠號和伺服器的ip...

簡單socket通訊示例

int socket int domain,int type,int protocol domain 位址族 af unix,af local local communication unix域協議族 af inet ipv4 internet protocols af inet6 ipv6 int...

基於SOCKET簡單通訊程式

主要功能 利用c s模式,可以多台客服機於主機通訊。標頭檔案 ifndef head h define head h include include include include include include include include include include include inc...