聊天平台 初级服务器:
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()
感觉多人聊天这个好好玩,大家可以在一个服务器上相互聊天,相当于群聊,哈哈哈哈。