socket通信

server端

import os
from socket import socket
import hashlib


def chat(connect: socket, address):
    while True:
        message = input('>>>')
        # 9、发送消息使用send,发送的内容需要使用encode函数将字符串转换成bytes型数据
        connect.send(message.encode())
        if message in ['拜拜', '再见', 'Bye-Bye']:
            return
        # 10、接受数据
        re_message = connect.recv(1024).decode(encoding='utf-8')
        # address是一个列表,第一个元素是消息源ip地址,第二个是端口号
        print(f'{address[0]}:{re_message}')
        if re_message in ['拜拜', '再见', 'Bye-Bye']:
            return


def send_image(connect: socket):
    # 获取文件夹中所有图片的名称(列表形式存贮)
    all_image_name = os.listdir('./serverImage')

    message = ''
    for index, item in enumerate(all_image_name):
        message += f'{index}.{item}  '
    # 发送图片信息
    connect.send(message.encode())
    # 接受客户端的选择
    index = connect.recv(1024).decode(encoding='utf-8')
    try:
        if 0 <= int(index) < len(all_image_name):
            image_name = all_image_name[int(index)]
            print('发送图片...')
            with open('serverImage/'+image_name, 'rb') as f:
                image_content = f.read()
                # 生成图片的摘要
                hash = hashlib.md5()
                hash.update(image_content)
                digest = hash.hexdigest()
                # 发送摘要
                connect.send(digest.encode())
                # 发送图片
                connect.send(image_content)
        else:
            print('取消图片发送')
    except ValueError:
        print('取消图片发送')




def create_server():
    # 1、创建套接字对象
    server = socket()
    # 2、服务端绑定Ip地址和端口号
    server.bind(('10.7.165.86', 4568))
    # 3、监听请求,其中的200为最大通信的数量
    server.listen(200)
    # 4、等待客户端的连接
    while True:
        print('等待.....')
        # 5、接受客户端的请求-这句话会阻塞线程,直到有客户端的请求才会执行
        connect, address = server.accept()
        # 建立连接后的操作
        while True:
            # 6、接受消息,接收到的消息都是二进制(bytes),需要使用decode转换成字符串类型数据
            message = connect.recv(1024).decode(encoding='utf-8')
            # 7、功能选择
            if message == 'chat':
                print('聊天')
                chat(connect, address)
            elif message == 'image':
                print('发图片')
                send_image(connect)
            elif message == 'close':
                # 8、断开服务器的连接
                connect.close()
                break


if __name__ == '__main__':
    create_server()
    # int('hj')

client端

import re
from socket import socket
import hashlib
import uuid



def get_digest(data):
    hash = hashlib.md5()
    hash.update(data)
    return hash.hexdigest()


def chat(client):
    # 告诉服务器现在要聊天
    client.send('chat'.encode(encoding='utf-8'))
    while True:
        re_message = client.recv(1024).decode(encoding='utf-8')
        print('服务器:'+re_message)
        if re_message in ['拜拜', '再见', 'Bye-Bye']:
            return

        message = input('客户端:')
        client.send(message.encode())
        if message in ['拜拜', '再见', 'Bye-Bye']:
            return


def get_image(client):
    # 告诉服务器现在要拿图
    client.send('image'.encode(encoding='utf-8'))

    # 接受图片信息
    image_message = client.recv(1024).decode(encoding='utf-8')
    print(image_message+'')
    index = input('请选择(输入标号,如果不需要输入其他值):')
    # 发送选择的图片的标号
    client.send(index.encode())
    # 根据选择判断是否需要接受图片
    all_index = re.findall(r'\b(\d+)\.', image_message)
    if index in all_index:
        print('接受图片')
        # 接受图片摘要
        digest = client.recv(1024).decode(encoding='utf-8')
        # 接受图片
        image_data = bytes()
        while True:
            image_data += client.recv(2048)
            if get_digest(image_data) == digest:
                print('图片接受完成')
                with open('clientImage/'+uuid.uuid4().hex, 'wb') as f:
                    f.write(image_data)

                break
    else:
        print('不接受图片')


def close_connection(client):
    # 告诉服务器关闭连接
    client.send('close'.encode(encoding='utf-8'))
    client.close()
    exit()


def create_client():
    client = socket()
    client.connect(('10.7.165.86', 4568))

    while True:
        print('1. 聊天\n2. 获取图片\n3. 断开连接')
        value = input('请选择(1~3):')
        if value == '1':
            # print('聊天')
            chat(client)
        elif value == '2':
            # print('获取图片')
            get_image(client)

        elif value == '3':
            print('断开连接')
            close_connection(client)
        else:
            print('输入有误!')


if __name__ == '__main__':
    create_client()
    # message = '0.avatar.png  1.icon2.png  2.tie2.png  3.luffy1.png '
    # print(re.findall(r'\b(\d+)\.', message))
    # print(uuid.uuid4().hex)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值