Python_Weekend_18 群聊平台、发邮件、发短信

聊天平台 初级服务器:

from socket import socket
from threading import Thread


def main():
    class ClientHandler(Thread):  # 创建多线程

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):
            while True:
                try:
                    data = self._client.recv(1024)  # 设置缓存区  接收内容
                    for client in clients:  # 遍历
                        client.send(data)  # 转发消息给所有人

                    if data.decode('utf-8') == 'byebye':   # 解码 说拜拜的时候
                        clients.remove(self._client)    # 从服务器移除客户
                        self._client.close()            # 断开连接
                        break
                except Exception as e:    #如果出现程序错误
                    print(e)        #打印报错信息
                    clients.remove(self._client)    # 程序出错就移除用户 收不到消息
                    break
    server = socket()  # 套接字创建
    server.bind(('10.7.189.53', 22222))  # 绑端口 2的16次方减1  (可以用命令行参数 -sys.argv可以把Ip写灵活的)
    server.listen(512)  # 开启监听
    clients = []  # 记录连上用户的
    while True:
        curr_client, addr = server.accept()  # 元组 = 接收用户信息
        clients.append(curr_client)  # 记录连上用户
        ClientHandler(curr_client).start()


if __name__ == '__main__':
    main()

运行上面代码后,什么都不会显示,静静等待各各客户端的连接…..

from socket import  socket
from threading import Thread


def main():

    class RefreshScrenThread(Thread):

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):   #刷屏  消息刷新
            while running:
                data = self._client.recv(1024)
                print(data.decode('utf-8'))

    nickname = input('请输入你的昵称:')
    myclient = socket()
    myclient.connect(('10.7.189.116',1234))
    running = True
    RefreshScrenThread(myclient).start()
    while running:
        content = input('请发言:')    # 设置发言
        if content == 'byebye':                 # 说bye 就断开
            myclient.send(content.encode('utf-8'))  # 保存到服务器
            running = False
        eag = nickname + ':' + content  #区分谁发言  发言带冒号名字
        myclient.send(eag.encode('utf-8')) # 保存到服务器


if __name__ == '__main__':
    main()
请输入你的昵称:苹果  

# 输入用户名  可以开始实现消息互发

实现图片的传输
首先是传输方:

from socket import socket, SOCK_DGRAM
from time import sleep


def main():
    sender = socket(type=SOCK_DGRAM)   # 设置UDP 类型传输文件
    with open('mm.jpg', 'rb') as f:
        data = f.read()
        data_len = len(data)  ## 文件字节长度  f.seek  f.tell 也可以算长度
        total = 0
        while total < data_len:
            sender.sendto(data[total:total + 1024], ('10.7.189.53', 22222))  # 内容 , 地址
            # sendto 是发送 因为数据太大 所以切片来接衔接收数据
            total += 1024
            sleep(0.001)


if __name__ == '__main__':
    main()

接收方,收到数据形成图片,并重命名为hello.jpg文件保存

from socket import socket, SOCK_DGRAM


def main():
    receiver = socket(type=SOCK_DGRAM)
    receiver.bind(('10.7.189.53', 22222))
    data = bytes()  # 拼 装
    while True:
        seg, addr = receiver.recvfrom(1024)  # recvfrom是阻塞是方法  接收数据
        data += seg  # 新拿到的数据追加进去  接收文件远大于1024 就要拼接
        if len(data) >= 69611:
            break
    with open('hello.jpg', 'wb') as f:
        f.write(data)
    print('图片已接收。')


if __name__ == '__main__':
    main()

发送邮件给QQ邮箱:

import smtplib
from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText


def main():
    sender = smtplib.SMTP_SSL('smtp.qq.com',465)  # 创建
    sender.login('[email protected]','osqyoywlpbbcdf') #  登录  osqyoywlpbcdf 是邮箱MAP/SMTP服务 KEY密

    message =   MIMEMultipart()
    text_msg = MIMEText('附件中有本月要做的历年账目表','plain','utf-8')
    message.attach(text_msg)

    att2 = MIMEText(open('历年账目表.docx','rb').read(),'base64','utf-8')
    att2['Content-Type'] = 'applocation/octet-strem'
    att2['Content-Diposition'] = 'attachment;filename = foo.xlsx'
    message.attach(att2)
    sender.sendmail('[email protected]',['[email protected]'],message.as_string())
    #[email protected] 是接收邮箱者

    print('发送完成!')


if __name__ == '__main__':
    main()

发送短信的:
‘account’: ”,
‘password’: ”,
这两个参数需要找接口,这里用的是huyiwuxian

import urllib.parse
import http.client
import json

host = "106.ihuyi.com"
sms_send_uri = "/webservice/sms.php?method=Submit"

params = urllib.parse.urlencode({
    'account': '',
    'password': '',
    'content': '您的验证码是:147258。请不要把验证码泄露给其他人。',
    'mobile': '18281599458',
    'format': 'json'
})
print(params)
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
conn = http.client.HTTPConnection(host, port=80, timeout=10)
conn.request('POST', sms_send_uri, params, headers)
response = conn.getresponse()
response_str = response.read()
jsonstr = response_str.decode('utf-8')
print(json.loads(jsonstr))
conn.close()

感觉多人聊天这个好好玩,大家可以在一个服务器上相互聊天,相当于群聊,哈哈哈哈。

猜你喜欢

转载自blog.csdn.net/weixin_41782332/article/details/79656225