主要内容:建立简易聊天室服务器及客户端、采用UDP协议发送及接受图片,采用smtplib发送邮件,采用urllib发送短信
建立简易聊天室
服务器
from socket import socket
from threading import Thread
def main():
class ClientHandler(Thread):
def __init__(self, client):
super(ClientHandler, self).__init__()
self._client = client
def run(self):
try:
while True:
try:
data = self._client.recv(1024)
if data.decode('utf-8') == 'byebye':
clients.remove(self._client)
self._client.close()
break
else:
for client in clients:
client.send(data)
except Exception as e:
print(e)
clients.remove(self._client)
break
except Exception as e:
print(e)
server = socket()
server.bind(('10.7.189.92', 6789))
server.listen(512)
clients = []
while True:
now_client, address = server.accept()
print(address[0], '连接到服务器')
clients.append(now_client)
ClientHandler(now_client).start()
if __name__ == '__main__':
main()
客户端
from socket import socket
from threading import Thread
def main():
class Refresh(Thread):
def __init__(self, client):
super(Refresh, self).__init__()
self._client = client
def run(self):
while running:
data = self._client.recv(1024)
print(data.decode('utf - 8'))
name = input('昵称:')
my_client = socket()
my_client.connect(('10.7.189.92', 6789))
running = True
Refresh(my_client).start()
while running:
content = input('发言:')
if content == 'byebye':
my_client.send(content.encode('utf-8'))
running = False
else:
msg = name + ':' + content
my_client.send(msg.encode('utf - 8'))
if __name__ == '__main__':
main()
采用UDP协议发送与接收图片
发送
from socket import socket, SOCK_DGRAM
def main():
sender = socket(type=SOCK_DGRAM)
with open('ml.jpg', 'rb') as f:
data = f.read()
data_len = len(data)
total = 0
while total < data_len:
sender.sendto(data[total:total + 1024],
('此处为ip地址即发送给谁', 端口号))
total += 1024
if __name__ == '__main__':
main()
接收
from socket import socket, SOCK_DGRAM
def main():
receiver = socket(type=SOCK_DGRAM)
receiver.bind(('绑定自己的IP', 端口号))
data = bytes()
while True:
seg, address = receiver.recvfrom(1024)
data += seg
print(len(data))
if len(data) >= 609856:
break
with open('mlm.jpg', 'wb') as f:
f.write(data)
print('图片已接收!')
if __name__ == '__main__':
main()
小结:采用UDP协议发送消息或者图片等,可以不经过对方同意,只需要对方一连接,就可以发送给对应客户端,但是可能受各种信号的干扰导致发送不成功或者发送不完全。图片太大的话可以分字节发送,或者加上time,每隔0.01或者更多时间发送一次,这样可以降低收到的干扰,使得文件等不容易发送丢失
发送邮件及附件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def main():
sender = smtplib.SMTP('smtp.163.com')
sender.login('1邮箱账号', '邮箱密码')
message = MIMEMultipart()
message['Subject'] = 'DBYQX,晚上好!请查收附件!'
text_msg = MIMEText('请查收附件,你懂得!', 'plain','utf-8')
message.attach(text_msg)
att = MIMEText(open('相关信息.docx','rb').read(), 'base64', 'utf-8')
att['Content-Type'] = 'application/octet-stream'
att['Content-Disposition'] = 'attachment;filename=too.docx'
message.attach(att)
sender.sendmail('18281604435@163.com', ['1113792848@qq.com'],
message.as_string())
print('发送完成!')
if __name__ == '__main__':
main()
小结:通过在邮箱内开通stmp协议,可以让右件通过第三方登陆,从而可以通过python发送邮件,但是很可能当成垃圾邮件
给手机发送短信
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': '此处为电话号码,发送给谁?',
'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()
小结:通过第三方,可以群发短消息,就好像以前的飞信一样,可以群发消息,不过这次是写代码完成,而不是简单的编辑短信然后发送~