博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python】TCP/IP编程
阅读量:5217 次
发布时间:2019-06-14

本文共 5551 字,大约阅读时间需要 18 分钟。

No1:

【TCP】

客户端

import sockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(('www.sina.com.cn',80))s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection:close\r\n\r\n')buffer=[]while True:    d=s.recv(1024)    if d:        buffer.append(d)    else:        breakdata=b''.join(buffer)s.close()header,html = data.split(b'\r\n\r\n',1)print(header.decode('utf-8'))with open('sina.html','wb') as f:    f.write(html)

运行结果得到一个sina.html文件,双击打开是新浪主页

服务端接受客户端

import socket,threadings=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind(('127.0.0.1',9999))s.listen(5)print('Waiting for connection...')def tcplink(sock,addr):    print('Accept new connection from %s:%s...' % addr)    sock.send(b'Welcome!')    while True:        data = sock.recv(1024)        time.sleep(1)        if not data or data.decode('utf-8')=='exit':            break        sock.send(('Hello,%s' % data.decode('utf-8')).encode('utf-8'))    sock.close()    print('Connection from %s:%s closed.' % addr)    while True:    sock,addr = s.accept()    t=threading.Thread(target=tcplink,args=(sock,addr))    t.start()
import sockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(('127.0.0.1',9999))print(s.recv(1024).decode('utf-8'))for data in [b'Michael',b'Tracy',b'Sarah']:    s.send(data)    print(s.recv(1024).decode('utf-8'))s.send(b'exit')s.close()

No2:

【UDP】

服务端接受客户端

import sockets=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(('127.0.0.1',9999))print('Bind UDP on 9999....')while True:    data,addr=s.recvfrom(1024)    print('Received from %s:%s.' % addr)    s.sendto(b'Hello,%s!' % data,addr)
import sockets=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)for data in [b'Michael',b'Tracy',b'Sarah']:    s.sendto(data,('127.0.0.1',9999))    print(s.recv(1024).decode('utf-8'))s.close()

运行结果

No3:

【SMTP发送邮件】

构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。

from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr,formataddrimport smtplibdef _format_addr(s):    name,addr=parseaddr(s)    return formataddr((Header(name,'utf-8').encode(),addr))    from_addr=input('From:')password=input('Password:')to_addr=input('To:')smtp_server=input('SMTP server:')msg=MIMEText('hello,send by Python...','plain','utf-8')msg['From']=_format_addr('Python爱好者<%s>' % from_addr)msg['To']=_format_addr('管理员<%s>' % to_addr)msg['Subject']=Header('来自SMTP的问候。。。','utf-8').encode()server=smtplib.SMTP(smtp_server,25)server.set_debuglevel(1)server.login(from_addr,password)server.sendmail((from_addr,[to_addr],msg.as_string()))server.quit()

发送附件

msg=MIMEMultipart()msg['From']=_format_addr('Python爱好者<%s>'%from_addr)msg['To']=_format_addr('管理员<%s>'%to_addr)msg['Subject']=Header('来自SMTP的问候。。。','utf-8').encode()msg.attach(MIMEText('send with file...','plain','utf-8'))with open('/Users/michael/Download/test.png','rb') as f:    mime=MIMEBase('image','png',filename='test.png')    mime.add_header('Content-Disposition','attachment',filename='test.png')    mime.add_header('Content-ID','<0>')    mime.add_header('X-Attachment-Id','0')    mime.set_payload(f.read())    encoders.encode_base64(mime)    msg.attach(mime)

No4:

【Pop3接收邮件】

Python的poplib模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用email模块把原始邮件解析为Message对象,然后,用适当的形式把邮件内容展示给用户即可。

先接收

import poplibemail=input('Email:')password=input('Password:')pop3_server=input('POP3 server:')server=poplib.POP3(pop3_server)server.set_debuglevel(1)print(server.getwelcome().decode('utf-8'))server.user(email)server.pass_(password)print('Message:%s. Size:%s' % server.stat())resp,mails,octets=server.list()print(mails)index=len(mails)resp,lines,octets=server.retr(index)msg_content=b'\r\n'.join(lines).decode('utf-8')msg=Parser().parsestr(msg_content)server.quit()

再解析

from email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddrimport poplibmsg=Parser().parsestr(msg_content)def print_info(msg,indent=0):    if indent==0:        for header in ['From','To','Subject']:            value=msg.get(header,'')            if value:                if header == 'Subject':                    value = decode_str(value)                else:                    hdr,addr=parseaddr(value)                    name=decode_str(hdr)                    value=u'%s<%s>' % (name,addr)            print('%s%s: %s' % ('  ' * indent,header,value))    if(msg,is_multipart()):        parts=msg.get_payload()        for n,part in enumerate(parts):            print('%spart %s' % ('  ' * indent,n))            print('%s------------------' % ('   ' * indent))            print_info(part,indent+1)    else:        content_type=msg.get_content_type()        if content_type=='text/plan' or content_type=='text/html':            content=msg.get_payload(decode=True)            charset=guess_charset(msg)            if charset:                content=content.decode(charset)            print('%sText: %s' % ('   ' * indent,content + '...'))        else:            print('%sAttachment: %s' % ('  ' * indent,content_type))            def decode_str(s):    value,charset = decode_header(s)[0]    if charset:        value = value.decode(charset)    return value    def guess_charset(msg):    charset=msg.get_charset()    if charset is None:        content_type=msg.get('Content-Type','').lower()        pos=content_type.find('charset=')        if pos >= 0:            charset=content_type[pos + 8].strip()    return charset

 

转载于:https://www.cnblogs.com/anni-qianqian/p/9265672.html

你可能感兴趣的文章
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>
Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
查看>>
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
查看>>
Hibernate中inverse="true"的理解
查看>>
高级滤波
查看>>
使用arcpy添加grb2数据到镶嵌数据集中
查看>>
[转载] MySQL的四种事务隔离级别
查看>>
QT文件读写
查看>>
C语言小项目-火车票订票系统
查看>>
15.210控制台故障分析(解决问题的思路)
查看>>
BS调用本地应用程序的步骤
查看>>
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>