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