day 08 python正则表达式,socket网络编程(TCP/UDP)
正则表达式re
import re a = re.match('f..', 'food') print(a.group()) # 从左至右匹配,匹配到返回值,匹配不到返回None b = re.findall('f..', 'seafood is food') print(b) # 返回所有匹配项组成的列表,['foo', 'foo'] result = re.findall('f..', 'seafood is food') for c in result: # 从迭代器中逐个去除匹配的对象 print(c) d = re.sub('f..', 'abc', 'seafood is food') # 用abc替换f开始的三位 print(d) # seaabcd is abcd e = re.split('-|\.', 'hello-world.tar.gz') # 切割,用-或这.,.需要转义 print(e) # ['hello', 'world', 'tar', 'gz'] patt = re.compile('f..') # 先把要匹配的模式编译,提升效率 f = patt.search('seafood') # 指定在哪个字符串中匹配和匹配的方式 print(f.group()) # foo
正则表达式提取nginx日志中的IP地址和部分浏览器访问的次数
import re def count_patt(fname, patt): cpatt = re.compile(patt) result = {} with open(fname) as fobj: for line in fobj: m = cpatt.search(line) if m: key = m.group() result[key] = result.get(key, 0) + 1 return result if __name__ == '__main__': fname = '/var/log/nginx/access.log' ip='^(\d+\.){3}\d+' print(count_patt(fname, ip)) print('') br = "Firefox|MSIE|Chrome" print(count_patt(fname, br))
使用正则表达式加排序,检测nginx日志中ip的次数,排序
import re from collections import Counter class CountPatt: def __init__(self, fname): self.fname = fname def count_patt(self, patt): cpatt = re.compile(patt) result = Counter() with open(self.fname) as fobj: for line in fobj: m = cpatt.search(line) if m: result.update([m.group()]) return result if __name__ == '__main__': c = CountPatt('/var/log/nginx/access.log') ip = '^(\d+\.){3}\d+' br = "Firefox|MSIE|Chrome" a = c.count_patt(ip) print(a) print(a.most_common(2)) print(c.count_patt(br))
网络编程
c/s结构
套接字 (基于网络的套接字:AF_INET)
绑定地址 绑定端口号
面向连接的主要协议就是传输控制协议TCP,套接字类型为:SOCK_STREAM
无连接的主要协议是用户数据包协议UDP,套接字类型为:SOCK_DGRAM
Python中使用socket模块中的socket函数实现套接字的创建。(套接字:可以理解为一个接口,好比网卡上插网线的接口)
创建TCP服务器
创建TCP服务器的主要步骤:
1、创建服务器套接字: s = socket.socket()
2、绑定地址到套接字: s.bind()
3、启动监听:s.listen()
4、接受客户端链接:s.accepy()
5、与客户端通信:recv() / send()
6、关闭套接字:s.close()
import socket host = '' # 表示本机所有地址,类似0.0.0.0 port = 12345 # 端口,应该大于1024 addr = (host, port) s = socket.socket() # 默认值就是基于TCP的网络套接字 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置选项,程序结束之后可以立即再运行,否则要等60秒 s.bind(addr) # 绑定地址到套接字 s.listen(2) # 启动侦听进程2个,目前都是单进程的进程,写几无所谓 cli_sock, cli_addr = s.accept() # 等待客户端链接 print('客户端来自:', cli_addr) # 连上来之后服务端输出 print(cli_sock.recv(1024)) # 一次最多读1024个字节 cli_sock.send(b'I R E') # 给客户端发送数据,数据要求是bytes类型 cli_sock.close() s.close()
创建一个可以连续收发消息的服务端
import socket host = '' port = 12345 addr = (host, port) s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(addr) s.listen(1) while True: cli_sock, cli_addr = s.accept() print('Client connect from:', cli_addr) while True: data = cli_sock.recv(1024) if data.strip() == b'end': break print(data.decode('utf8')) # bytes类型转为string类型 data = input('> ') + '\r\n' # 获得的是string类型 cli_sock.send(data.encode('utf8')) # 转成bytes类型发送 cli_sock.close()
创建TCP客户端
1.创建TCP客户端套接字:
cs=socket.socket()
2.连接服务器:
cs.connect()
3.与服务器通信:
cs.send() cs.recv()
4.关闭客户端套接字
cs.close()
连接服务端发送消息
import socket host = '127.0.0.1' # 地址 port = 12345 # 服务端端口 addr = (host, port) c = socket.socket() # 启动socket c.connect(addr) # 连接 while True: data = input('> ') + '\r\n' # 输入 c.send(data.encode('utf8')) # 转换成utf8 if data.strip() == 'end': break data2 = c.recv(1024) # 接受服务端的数据 print(data2.decode('utf8')) # 转换成utf8 c.close() # 关闭
结果
创建UDP服务器
创建UDP服务器的主要步骤:
1.创建服务器套接字:
s = socket.socket()
2.绑定服务器套接字:
s.bind()
3.接收、发送数据:
s.recvfrom() ss.sendto()
4:关闭套接字:
s.close()
创建UDP客户端
创建UDP客户端主要步骤:
1.创建客户端套接字:
cs = socket.socket()
2.与服务器通信:
cs.sendto()
cs.recvfrom()
3.关闭客户端套接字:
cs.close()
使用OOP,编写TCP服务器,接受参数,返回时间+参数
import socket from time import strftime class TcpTimeServer: def __init__(self, host='', port=12345): self.addr = (host, port) self.server = socket.socket() self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server.bind(self.addr) self.server.listen(1) def chat(self, client_sock): while True: data = client_sock.recv(1024) clock = strftime('%H:%M:%S') if data == b'quit': break data = '[%s] %s' %(clock, data.decode('utf8')) client_sock.send(data.encode('utf8')) client_sock.close() def mainloop(self): while True: client_socket, client_addr = self.server.accept() self.chat(client_socket) self.server.close() if __name__ == '__main__': server = TcpTimeServer() server.mainloop()