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()

  

 

posted @ 2020-06-11 14:01  江戸川のコナン  阅读(164)  评论(0编辑  收藏  举报
……