欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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