python用socket实现通信的简单实例

这个实例实现的功能:

    利用多线程处理多个用户请求的服务器,该服务器会向连向它的客户端发送一张图片。

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()

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值