python - socket模块1
生活随笔
收集整理的這篇文章主要介紹了
python - socket模块1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.使用生活中的接打電話,解釋socket通信流程 2.根據上圖,寫出socket通信的偽代碼 2.1.server端偽代碼 #買手機 #買手機卡 #開機 #等待電話 #收消息 #發消息 #掛電話 2.2.client端偽代碼 #買手機 #撥號 #發消息 #收消息 #掛電話 3.根據偽代碼寫出程序 server端收到client 發送的字母后,把字母轉換成大寫并發送給client端 3.1.server端代碼 import socket
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
recv_data = conn.recv(1024)
#發消息
send_data = recv_data.upper()
conn.send(send_data)
#掛電話
conn.close() 3.2.client端代碼 import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
send_data = input(">>>:").strip()
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close() 運行: 先運行server端程序,然后運行client端程序 out: >>>:hello HELLO 注意點: 1.server和client 通信傳輸的是bytes流,在2.7以前是str流 二、socket簡單交互 1.基于python3.5.2版本的socket只能收發字節(python2.7可以發送str) 2.退出只在客戶端退出就OK了 3.s.accept()和s.recv()是阻塞的,前提是已經建立了連接 server端: #循環輸入,exit退出,可以輸入空字符
import socket
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
send_data = recv_data.upper()
conn.send(send_data)
#掛電話
conn.close()
client端 #循環輸入,exit退出,可以輸入空字符
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print("----------------",type(recv_data))
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close()
import socket
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
while True:
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
try: #客戶端強制斷開(不是輸入exit) 會出現異常。
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
send_data = recv_data.upper()
conn.send(send_data)
except Exception:
break
#掛電話
conn.close()
client端 #一個客戶端斷開連接后,服務端還可以接受新的連接
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print("----------------",type(recv_data))
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close() 關于s.listen(n) n代表:能掛起的鏈接數,如果n=1 ,代表可以連接一個,掛起一個,第三個拒絕 表示可以處理一個請求連接,并且掛起一個請求連接。如果再有連接過來會報錯。 如下是我設置s.listen(2)測試的結果: s.listen(2)表示只能掛起兩個請求連接,第3個請求就會報錯。 ? 解決粘包的問題: 1.服務端在發送數據之前,先把發送數據的長度告訴客戶端,要發送多少數據,然后客戶端根據這個數據的長度循環接收就OK 傳輸過程: 服務端: 1.send ?#數據長度
4.recv ?#收到確認信息,開始下一步發送 send ?#發送數據 客戶端?: 2.recv #獲取數據長度
3.send #發送確認信息 recv #循環接收 server端代碼: #解決粘包問題
send_data = bytes(send_data,encoding='utf-8') #編碼成utf-8,字節,并把str轉換為字節
ready_tag = 'Ready|%s' %len(send_data)
conn.send(bytes(ready_tag,encoding='utf-8'))
feedback = conn.recv(1024) #收到客戶端發送過來的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 轉換為str
if feedback.startswith('Start'):
conn.send(send_data) client端代碼: #解決粘包的問題
ready_tag = s.recv(1024) # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-1])
start_tag = 'Start'
s.send(bytes(start_tag,encoding='utf-8')) #給server發送Start,告訴server可以準備發送數據了
recv_size = 0 #初始化數據大小
recv_msg =b''
while recv_size < msg_size:
recv_data = s.recv(1024)
recv_msg += recv_data
recv_size += len(recv_data)
print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))
print(str(recv_msg,encoding='utf-8'))
import socket
import subprocess
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(2)
#等待電話
while True:
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
try: #客戶端強制斷開(不是輸入exit) 會出現異常。
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
p=subprocess.Popen(str(recv_data,encoding='utf-8'),shell=True,stdout=subprocess.PIPE)
res = p.stdout.read()
if len(res) == 0: #處理輸入的錯誤命令
send_data = 'cmd err'
else:
send_data = str(res,encoding='gbk') #windows平臺下解碼成gbk,并且gbk轉換為str
#解決粘包問題
send_data = bytes(send_data,encoding='utf-8') #編碼成utf-8,字節,并把str轉換為字節
ready_tag = 'Ready|%s' %len(send_data)
conn.send(bytes(ready_tag,encoding='utf-8'))
feedback = conn.recv(1024) #收到客戶端發送過來的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 轉換為str
if feedback.startswith('Start'):
conn.send(send_data)
except Exception:
break
#掛電話
conn.close() client端: #一個客戶端斷開連接后,服務端還可以接受新的連接
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
#解決粘包的問題
ready_tag = s.recv(1024) # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-1])
start_tag = 'Start'
s.send(bytes(start_tag,encoding='utf-8')) #給server發送Start,告訴server可以準備發送數據了
recv_size = 0 #初始化數據大小
recv_msg =b''
while recv_size < msg_size:
recv_data = s.recv(1024)
recv_msg += recv_data
recv_size += len(recv_data)
print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))
print(str(recv_msg,encoding='utf-8'))
#掛電話
s.close()
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
recv_data = conn.recv(1024)
#發消息
send_data = recv_data.upper()
conn.send(send_data)
#掛電話
conn.close() 3.2.client端代碼 import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
send_data = input(">>>:").strip()
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close() 運行: 先運行server端程序,然后運行client端程序 out: >>>:hello HELLO 注意點: 1.server和client 通信傳輸的是bytes流,在2.7以前是str流 二、socket簡單交互 1.基于python3.5.2版本的socket只能收發字節(python2.7可以發送str) 2.退出只在客戶端退出就OK了 3.s.accept()和s.recv()是阻塞的,前提是已經建立了連接 server端: #循環輸入,exit退出,可以輸入空字符
import socket
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
send_data = recv_data.upper()
conn.send(send_data)
#掛電話
conn.close()
client端 #循環輸入,exit退出,可以輸入空字符
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print("----------------",type(recv_data))
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close()
三、
一個客戶端斷開連接后,服務端還可以接受新的連接 server端 #一個客戶端斷開連接后,服務端還可以接受新的連接import socket
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(5)
#等待電話
while True:
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
try: #客戶端強制斷開(不是輸入exit) 會出現異常。
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
send_data = recv_data.upper()
conn.send(send_data)
except Exception:
break
#掛電話
conn.close()
client端 #一個客戶端斷開連接后,服務端還可以接受新的連接
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
recv_data = s.recv(1024)
print("----------------",type(recv_data))
print(str(recv_data,encoding='utf-8'))
#掛電話
s.close() 關于s.listen(n) n代表:能掛起的鏈接數,如果n=1 ,代表可以連接一個,掛起一個,第三個拒絕 表示可以處理一個請求連接,并且掛起一個請求連接。如果再有連接過來會報錯。 如下是我設置s.listen(2)測試的結果: s.listen(2)表示只能掛起兩個請求連接,第3個請求就會報錯。 ? 解決粘包的問題: 1.服務端在發送數據之前,先把發送數據的長度告訴客戶端,要發送多少數據,然后客戶端根據這個數據的長度循環接收就OK 傳輸過程: 服務端: 1.send ?#數據長度
4.recv ?#收到確認信息,開始下一步發送 send ?#發送數據 客戶端?: 2.recv #獲取數據長度
3.send #發送確認信息 recv #循環接收 server端代碼: #解決粘包問題
send_data = bytes(send_data,encoding='utf-8') #編碼成utf-8,字節,并把str轉換為字節
ready_tag = 'Ready|%s' %len(send_data)
conn.send(bytes(ready_tag,encoding='utf-8'))
feedback = conn.recv(1024) #收到客戶端發送過來的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 轉換為str
if feedback.startswith('Start'):
conn.send(send_data) client端代碼: #解決粘包的問題
ready_tag = s.recv(1024) # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-1])
start_tag = 'Start'
s.send(bytes(start_tag,encoding='utf-8')) #給server發送Start,告訴server可以準備發送數據了
recv_size = 0 #初始化數據大小
recv_msg =b''
while recv_size < msg_size:
recv_data = s.recv(1024)
recv_msg += recv_data
recv_size += len(recv_data)
print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))
print(str(recv_msg,encoding='utf-8'))
四、socket簡單ssh
server端: #一個客戶端斷開連接后,服務端還可以接受新的連接import socket
import subprocess
ip_port=('127.0.0.1',9999)
#買手機
s = socket.socket()
#買手機卡
s.bind(ip_port)
#開機
s.listen(2)
#等待電話
while True:
conn,addr = s.accept()
#conn 相當于一條通信線路
#收消息
while True:
try: #客戶端強制斷開(不是輸入exit) 會出現異常。
recv_data = conn.recv(1024)
if len(recv_data) == 0:break
#發消息
p=subprocess.Popen(str(recv_data,encoding='utf-8'),shell=True,stdout=subprocess.PIPE)
res = p.stdout.read()
if len(res) == 0: #處理輸入的錯誤命令
send_data = 'cmd err'
else:
send_data = str(res,encoding='gbk') #windows平臺下解碼成gbk,并且gbk轉換為str
#解決粘包問題
send_data = bytes(send_data,encoding='utf-8') #編碼成utf-8,字節,并把str轉換為字節
ready_tag = 'Ready|%s' %len(send_data)
conn.send(bytes(ready_tag,encoding='utf-8'))
feedback = conn.recv(1024) #收到客戶端發送過來的Start
feedback = str(feedback,encoding='utf-8') #把收到的feedback 轉換為str
if feedback.startswith('Start'):
conn.send(send_data)
except Exception:
break
#掛電話
conn.close() client端: #一個客戶端斷開連接后,服務端還可以接受新的連接
import socket
ip_port = ('127.0.0.1',9999)
#買手機
s = socket.socket()
#撥號
s.connect(ip_port)
#發送消息
while True:
send_data = input(">>>:").strip()
if send_data == 'exit': break # 輸入exit 退出程序
if len(send_data) == 0: continue #如果輸入是空字符,退出本次循環,繼續下次循環
s.send(bytes(send_data,encoding='utf-8'))
#收消息
#解決粘包的問題
ready_tag = s.recv(1024) # Ready|9999
ready_tag = str(ready_tag,encoding='utf-8')
if ready_tag.startswith('Ready'): # Ready|9999
msg_size = int(ready_tag.split('|')[-1])
start_tag = 'Start'
s.send(bytes(start_tag,encoding='utf-8')) #給server發送Start,告訴server可以準備發送數據了
recv_size = 0 #初始化數據大小
recv_msg =b''
while recv_size < msg_size:
recv_data = s.recv(1024)
recv_msg += recv_data
recv_size += len(recv_data)
print('MSG SIZE %s RECE SIZE %s' % (msg_size, recv_size))
print(str(recv_msg,encoding='utf-8'))
#掛電話
s.close()
轉載于:https://www.cnblogs.com/pangguoping/p/5675715.html
總結
以上是生活随笔為你收集整理的python - socket模块1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse中用Maven创建We
- 下一篇: web05-CounterServlet