PythonNet_01_bj

本文深入探讨网络编程的基础知识,包括OSI七层模型、TCP/IP模型、三次握手及四次挥手过程,对比TCP与UDP协议特性,详细介绍socket编程方法,以及如何实现TCP服务器与客户端的通信。
  1. 网络编程
  2. 多任务编程(进程线程)
  3. 服务器开发训练
  4. mongodb
  5. 正则表达式
  6. 第二阶段项目训练

网络编程

网络起源 (了解)

网络目的 : 数据的传输

ISO : 国际标准化组织

OSI七层模型 ----》 网络通信的标准化流程
应用层 : 提供用户服务,具体的内容由特定程序规定
表示层 : 数据的压缩优化加密
会话层 : 建立应用连接,选择传输层服务
传输层 : 提供数据传输服务,流量控制
网络层 : 路由选择,网络互连
链路层 : 提供链路交换,具体的消息的发送
物理层 : 物理硬件,接口 网卡的规定

osi模型优点 : 将功能分开,降低网络传输中的耦合度每一部分完成自己的功能,开发更加清晰专一

四层模型
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层: 链路层 物理层

五层模型(tcp/ip模型)
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
链路层 : 链路层
物理层 : 物理层

要求 : 能够按顺序说出七层模型 五层和四层模型
知道每一层是什么作用
对网络消息传输流程有基本了解

协议 :网络通信中,各方必须遵守的规定。包括建立什么样的连接,消息结构等。

应用层 : TFTP HTTP DNS SMTP
传输层 : TCP UDP
网络层 : IP
物理层 : IEEE

网络相关概念

主机 : host 表示一台计算机

本地使用 : ‘localhost’
‘’
‘127.0.0.1’
网络使用 : ‘0.0.0.0’
‘172.60.50.60’

获取计算机名:
In [2]: socket.gethostname()
Out[2]: ‘tedu’

通过计算机名获取地址:
In [3]: socket.gethostbyname(‘tedu’)
Out[3]: ‘127.0.1.1’

IP地址

在网络上确定一台主机的地址
IPv4 :点分十进制 比如 192.168.1.72 0–255
32位二级制表示

IPv6 : 128位二进制

windows cmd.exe 窗口 --》 ipconfig
linux 查看本机地址 ifconfig

网络连接测试
ping 172.60.50.60

特殊IP
127.0.0.1 本地测试IP
0.0.0.0 使用局域网内可用的IP
192.168.1.0 表示当前网段
192.168.1.1 通常是网络节点设备的IP (网关)
192.168.1.255 广播地址

通过域名获取服务器信息
socket.gethostbyaddr(‘www.baidu.com’)
(‘127.0.0.1’, [], [‘119.75.213.61’])
主机 主机别名 主机IP

将点分十进制IP转换为二进制
In [11]: socket.inet_aton(‘192.168.1.2’)
Out[11]: b’\xc0\xa8\x01\x02’
将二进制转换为点分十进制IP
In [12]: socket.inet_ntoa(b’\xc0\xa8\x01\x02’)
Out[12]: ‘192.168.1.2’

功能 : 同上面两个完全相同。只是可以选择地址类型
inet_pton(socket.AF_INET,‘192.168.1.2’)
inet_ntop()

域名: 网络服务器地址的网络名称

端口号 : 端口号是网络地址的一部分,在一个系统中 每个网络应用都会有一个端口号相对应。用来在接收消息时确定由谁来接收

范围 : 1–65535
1–255 一些通用的众所周知程序占用
256-1023 系统应用端口
1024 — 65535 自用 >10000

获取应用端口:
In [16]: socket.getservbyname(‘mysql’)
Out[16]: 3306

字节序
数据在内存中的存储解析方式,不同操作系统可能不同

网络字节序 : 不同的操作系统在消息收发时均按照该标准操作。

传输层服务

面向连接的传输服务 ----》 tcp协议

传输特征:

可靠的数据传输
可靠性指数据传输中 无失序 无差错 无丢失 无重复

所有消息传输前一定会建立连接,传输后一定会断开连接

三次握手: 在进行面向连接的数据传输前进行传输连接的过程
1. 客户端向服务器发送连接请求(问是否可以连接)
2. 服务器接收到连接请求进行确认,返回报文
3. 客户端收到回复,进行连接建立

四次挥手: 在进行面向连接的数据传输时,断开连接的过程
1. 主动方发送报文 告知被动方要断开连接
2. 被动方返回报文,告知收到请求,准备断开
3. 被动方再次发送报文给主动方,告知准备完毕可以断开
4. 主动方发送报文进行断开

应用情况 :适用于传输较大的内容或文件,网络情况良好,需要保证传输可靠性的情况
比如 : 聊天信息,文件的上传下载,邮件传输
网页获取

面向无连接的传输服务 —》 udp协议

传输特点:
不保证可靠的数据传输
没有连接过程
数据的收发都比较自由,不会受另一端制约

适用情况: 网络情况较差,对传输可靠情形要求不高。需要提升传输效率的情况
比如 : 网络视频,群聊,发送广播

问题总结:
1.osi模型问题
2.三次握手四次挥手问题
3.tcp和udp的区别

socket套接字编程

目的 : 通过编程语言提供的函数接口进行组合,更简单的完成基于 tcp
或者udp通信的网路编程

套接字 : 完成上述目标的一种编程方法

套接字分类

流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信

数据报套接字 (SOCK_DGRAM):传输层基于udp协议进行通信

底层套接字 (SOCK_RAM):访问底层协议的套接字

TCP服务端

import socket

  1. 创建套接字
    socket.socket(socket_family = AF_INET,
    socket_type = SOCK_STREAM,
    proto = 0)
    功能 : 创建一个套接字
    参数 : socket_family : 选择地址族类型 AF_INET(使用IPv4)
    socket_type :套接字类型 SOCK_STREAM 流式
    SOCK_DGRAM 数据报
    proto :子协议类型,没有子协议选择 0 (底层套接字)
    返回值 : 套接字对象

  2. 绑定地址(IP 端口号)
    sockfd.bind()
    功能 : 绑定地址
    参数 : 一个元组包含两项
    第一项为IP第二项为端口号
    (‘172.60.50.50’,8888)

  3. 将套接字设置可监听
    sockfd.listen(n)
    功能 : 将套接字设置为监听套接字
    参数 : n是一个正整数 表示监听等待队列的大小

  • 等待队列:
  1. 等待接收连接请求
    connfd,addr = sockfd.accept()
    功能: 阻塞等待处理客户端连接
    返回值 : 第一个 : 一个新的套接字用来和客户端通 信
    第二个 : 连接的客户端的地址
  • 阻塞函数:程序运行到阻塞函数的位置,如果某种期待条件没有达成
    则暂停继续运行。当条件达成后会结束阻塞继续运行。
  1. 收发消息
    data = connfd.recv(buffersize)
    功能 : 流式套接字接收消息
    参数 : 一次最多接收多大的消息 字节
    返回值 : 返回接收到的内容

recv()是阻塞函数

e.g.
data = connfd.recv(1024).decode()

n = connfd.send(data)
功能 : 流式套接字发送消息
参数 : 要发送的内容 要求bytes格式
返回值 : 返回实际发送的字节数

e.g.
connfd.send(data.encode())

  1. 关闭套接字
    close()
    功能:关闭套接字 tcp套接字连接断开

#tcp_server.py
from socket import *

1.创建套接字

sockfd = socket(AF_INET,SOCK_STREAM)

2.绑定地址

sockfd.bind((‘172.60.50.50’,9999))

3.设置监听

sockfd.listen(5)

print(“Waiting for connect…”)

4.阻塞等待客户端请求

connfd,addr = sockfd.accept() # 没有连接客服端,阻塞在accept()处,等待客服端连接
print(“Connect from”,addr) # 打印地址

5.接收消息

data = connfd.recv(1024) # 客服端没发送消息阻塞在recv()
print(“Receive message:”,data.decode())

6.发送消息

n = connfd.send(‘I love China’.encode())

n = connfd.send(b’I love China’)
print(“发送了%d个字节”%n)

7.关闭套接字

connfd.close()
sockfd.close()

测试:telnet 172.60.50.50 9999

Waiting for connect…

Connect from (‘127.0.0.1’, 40168)

Receive message: hello

发送了12个字节

tcp 客户端

  1. 创建套接字
    socket()

  2. 请求连接
    connect()
    功能: 发起连接请求
    参数: 是一个元组,表示服务器的地址

  3. 消息收发
    recv() send()
    recv()是阻塞函数,要和send()函数相互配合使用

  4. 关闭套接字
    close()

#tcp_client.py
from socket import *

1.创建套接字

sockfd = socket(AF_INET,SOCK_STREAM)

2.发起连接 地址:服务端地址

sockfd.connect((‘172.60.50.50’,9999))

data = input(‘发送>>’)

3.将内容变为bytes格式发送

sockfd.send(data.encode())

data = sockfd.recv(1024).decode()
print(“收到消息:”,data)

4.关闭套接字

sockfd.close()

发送>>hello

收到消息: I love China

作业 :

  1. 口述 什么是七层模型,tcp/ip模型
    三次握手和四次挥手的过程
    tcp协议的传输和udp协议的传输有何区别
  2. 将tcp程序改写为一个通过循环可连续收发消息的程序

#tcp_server.py
from socket import *

#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)

#绑定地址
sockfd.bind((‘127.0.0.1’,9999))

#设置监听
sockfd.listen(5)
while True:
print(“Waiting for connect…”)
connfd,addr = sockfd.accept()
print(“Connect from”,addr)
while True:
data = connfd.recv(5)
if not data:
break
print(“Receive message:”,data.decode())
connfd.send(b’I love China’)
connfd.close()

sockfd.close()

tarena@tedu:~$ python3 01_tcp_server.py
Waiting for connect…
Connect from (‘127.0.0.1’, 40178)
Receive message: hello
Receive message: nihao

#tcp_client.py
from socket import *

#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)

#发起连接 地址:服务端地址
sockfd.connect((‘127.0.0.1’,9999))

while True:
data = input(‘发送>>’)
if not data:
break
#将内容变为bytes格式发送
sockfd.send(data.encode())
data = sockfd.recv(1024).decode()
print(“收到消息:”,data)

sockfd.close()

tarena@tedu:~$ python3 01_tcp_client.py 127.0.0.1 9999
发送>>hello
收到消息: I love China
发送>>nihao
收到消息: I love China
发送>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值