06网络通信udp-tcp、正则

一. udp网络程序

1.    udp网络程序-发送数据

1)创建客户端套接字

2)发送/接收数据

3)关闭套接字

from socket import *

 

# 1. 创建udp套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

 

# 2. 准备接收方的地址

# '192.168.1.103'表示目的ip地址

# 8080表示目的端口

dest_addr = ('192.168.1.103', 8080)  # 注意 是元组,ip是字符串,端口是数字

 

# 3. 从键盘获取数据

send_data = input("请输入要发送的数据:")

 

# 4. 发送数据到指定的电脑上的指定程序中

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

 

# 5. 关闭套接字

udp_socket.close()

在windows中运行“网络调试助手”

2.    发送、接收数据

from socket import *

 

# 1. 创建udp套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

 

# 2. 准备接收方的地址

dest_addr = ('192.168.236.129', 8080)

 

# 3. 从键盘获取数据

send_data = input("请输入要发送的数据:")

 

# 4. 发送数据到指定的电脑上

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

 

# 5. 等待接收对方发送的数据

recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数

 

# 6. 显示对方发送的数据

# 接收到的数据recv_data是一个元组

# 第1个元素是对方发送的数据

# 第2个元素是对方的ip和端口

print(recv_data[0].decode('gbk'))

print(recv_data[1])

 

# 7. 关闭套接字

udp_socket.close()

3.    udp绑定信息

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定;但是如果需要做成一个服务器端的程序的话,是需要绑定的。

from socket import *
 
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
 
# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) #  ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)
 
# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字节数
 
# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))
 
# 5. 关闭套接字
udp_socket.close()

二. Python3编码转换

1.    str->bytes:encode编码

text = '我是文本'

bytesText = text.encode()

2.    bytes->str:decode解码

bytesText.decode()

三. tcp网络程序

1.    概念

1)TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

2)TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

3)TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""

2. 特点

2.1 面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这一个连接进行。

完成数据交换后,双方必须断开此连接,以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

2.2 可靠传输

1)TCP采用发送应答机制:TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传:发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验:TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

4) 流量控制和阻塞管理:流量控制用来避免主机发送得过快而使接收方来不及完全收下。

3. 与udp区别

1)udp不需要建议相关的连接,只需要发送数据

2)tcp在通信开始之前,一定要先建立相关的链接,才能发送数据

4. tcp客户端

from socket import *

 

# 创建socket

tcp_client_socket = socket(AF_INET, SOCK_STREAM)

 

# 目的信息

server_ip = input("请输入服务器ip:")

server_port = int(input("请输入服务器port:"))

 

# 链接服务器

tcp_client_socket.connect((server_ip, server_port))

 

# 提示用户输入数据

send_data = input("请输入要发送的数据:")

 

tcp_client_socket.send(send_data.encode("gbk"))

 

# 接收对方发送过来的数据,最大接收1024个字节

recvData = tcp_client_socket.recv(1024)

print('接收到的数据为:', recvData.decode('gbk'))

 

# 关闭套接字

tcp_client_socket.close()

5.    tcp服务器

1)socket创建一个套接字

2) bind绑定ip和port

3) listen使套接字变为可以被动链接

4) accept等待客户端的链接

5) recv/send接收发送数据

from socket import *
 
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
 
# 本地信息
address = ('', 7788)
 
# 绑定
tcp_server_socket.bind(address)
 
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)
 
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()
 
# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
 
# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))
 
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
 

listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的

四. 正则表达式

1.    匹配单个字符

 

2.    匹配多个字符

 

3.    匹配开头结尾

 

示例:

 

4.    匹配分组

 

 

5.    正则的高级用法

1) search 可以匹配字符串中的任意位置,只要出现与正则表达式相匹配的表达式就行,group()之后返回匹配成功的部分,只能取第一块符合的

2) findall 类似上一个,返回所有符合的

3) sub 先匹配,然后替换(替换的部分也可以是一个函数)

ret = re.sub(r"\d+", 998, "python = 997")

python=998

 

6.    split

import re
 
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)

输出:

['info', 'xiaoZhang', '33', 'shandong']

猜你喜欢

转载自www.cnblogs.com/yaopeiyun/p/10356369.html