Python使用socket实现局域网传输数据(附加json数据传输及解析)以及判断socket是否断开连接
生活随笔
收集整理的這篇文章主要介紹了
Python使用socket实现局域网传输数据(附加json数据传输及解析)以及判断socket是否断开连接
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 本機實現服務端和客戶端的通信并傳輸字符串數據
1.1 服務端
# -*- coding: utf-8 -*- import socketserver = socket.socket() server.bind(('localhost', 1666)) # 將socket綁定到本機IP并且設定一個端口 server.listen(5) # 設置可以監聽5個連接exit = '' while True:con, addr = server.accept() # 會一直等待,直到連接客戶端成功print('連接到: ', addr)while con:msg = con.recv(1024).decode('utf-8') # 接受數據并按照utf-8解碼print('收到的數據是: ', msg)print('收到的數據類型是: ',type(msg))if msg == 'break':con.close() # 關閉本次連接exit = 'break'breakif exit == 'break':break server.close() # 關閉服務器?
1.2?客戶端
# -*- coding: utf-8 -*- import socketclient = socket.socket() client.connect(('localhost', 1666)) # 設置連接的服務器的IP和端口while True:str = input("請輸入數據: ")client.send(str.encode('utf-8')) # 設置編碼為utf-8client.close()?
1.3?程序運行效果
先執行服務端程序,再運行客戶端程序即可,效果如下圖所示。
?
2. 使用json傳輸字典dict數據并解析
2.1 不使用json傳輸字典dict的問題
不使用json傳輸字典數據,我們只需要使用eval()函數將要發送的字符串轉化為字典類型即可,如下圖。
然后運行結果如下圖
提示其實是表達,傳輸的數據應該是字節數據,而不是字典dict,所以我們不能直接傳輸字典數據,那我們接下來使用json來進行格式化和解析,程序如下。
2.2 客戶端
# -*- coding: utf-8 -*- import socket import json # 導入json包client = socket.socket() client.connect(('localhost', 1666)) # 設置連接的服務器的IP和端口while True:str = input("請輸入數據: ")dict_data = eval(str) # json格式化不對字符串類型有效# 所以使用eval函數先將字符串轉化為dict類型json_data = json.dumps(dict_data) # json對dict進行格式化client.send(json_data.encode('utf-8')) # 設置編碼為utf-8并轉換為字節流client.close()2.3 服務端
# -*- coding: utf-8 -*- import socket import json # 導入json包server = socket.socket() server.bind(('localhost', 1666)) # 將socket綁定到本機IP并且設定一個端口 server.listen(5) # 設置可以監聽5個連接exit = '' while True:con, addr = server.accept() # 會一直等待,直到連接客戶端成功print('連接到: ', addr)while con:msg = con.recv(1024).decode('utf-8') # 接受數據并按照utf-8解碼print('收到的數據是: ', msg)print('收到的數據類型是: ',type(msg))msg = json.loads(msg) # json對數據進行解析,得到dict數據for i in msg.keys():if isinstance(msg[i], dict):for j in msg[i].keys():print('key ', j, ' with value ', msg[i][j]) if msg == 'break':con.close()exit = 'break'breakif exit == 'break':break server.close()2.4 程序以及運行效果如下
?
3. socket連接斷開判斷
問題: 當客戶端斷開連接后,服務端會一直輸出空數據,停不下來。
解決:通過判斷接收到的數據是否為空字符串即可,可能同學們會疑問,如果我客戶端傳的就是空串,那不就直接退出了?其實你不用擔心,如果客戶端發送的空字符串,服務端還是等待接收,并不會往下執行。而且,你發不了空串,就如QQ不能直接回車發送一樣,如下圖。
總結
以上是生活随笔為你收集整理的Python使用socket实现局域网传输数据(附加json数据传输及解析)以及判断socket是否断开连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计数排序、桶排序和基数排序的运算性能对比
- 下一篇: Python,得到列表最小k个数或最大k