python用socket实现通信的简单实例
程序员文章站
2022-03-24 11:34:55
...
这个实例实现的功能:
利用多线程处理多个用户请求的服务器,该服务器会向连向它的客户端发送一张图片。
decode的作用是将其他编码的字符串转换成unicode编码。
如str1.decode('gbk'),表示将gbk编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串。
如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
服务器端:
import json
from base64 import b64encode
from socket import socket
from threading import Thread
pic_name, pic_data = '', ''
def main():
# 图片传送线程
class picthread(Thread):
def __init__(self, client):
Thread.__init__(self)
self._client = client
def run(self):
# 图片信息:名字,数据
dict_pic = {}
dict_pic['picName'] = pic_name
dict_pic['picData'] = pic_data
# dumps - 将Python对象处理成JSON格式的字符串
jsonStr = json.dumps(dict_pic)
# 向客服端传送图片的json信息
self._client.send(jsonStr.encode('gbk'))
# 断开连接
self._client.close()
# 创建套接字
server = socket()
# 绑定IP和端口
server.bind(('192.168.1.102', 5257))
# 开始监听
server.listen(521)
print('server start')
# 将二进制信息转换成b64encode
with open(r'C:\Users\Public\Pictures\Sample Pictures\Koala.jpg', 'rb') as f:
pic_name = f.name[f.name.rfind('\\') + 1:]
pic_data = b64encode(f.read()).decode('utf-8')
while True:
client, addr = server.accept()
print(str(addr) + ' accept!')
# 启动处理客服端请求的线程
picthread(client).start()
if __name__ == '__main__':
main()
小插曲,如果你的是windows系统,可以通过 telnet来访问服务器:
192.168.1.102 5257
客户端:
import json
import socket
from base64 import b64decode
def _main():
client = socket.socket()
client.connect(('192.168.1.102', 5257))
# 保存二进制数据的变量
c_data = bytes()
# 每次从服务器端接收1024个字节,直至全部接收完
data = client.recv(1024)
while data:
c_data += data
data = client.recv(1024)
# loads - 将字符串的内容反序列化成Python对象
c_dict = json.loads(c_data.decode('gbk'))
_name = c_dict['picName']
_data = c_dict['picData'].encode('utf-8')
# 将base64转换成二进制并写入文件
with open('C:\\Users\\Administrator\\Desktop\\client\\' + _name, 'wb') as f:
f.write(b64decode(_data))
print('save OK!')
client.close()
if __name__ == '__main__':
_main()