网络编程

基本概念:

本地的进程间通信有以下几种方式:
管道,信号,消息队列,共享内存。

而这几种方式都不能满足不同主机间进程的通信需求,于是在tcp/ip协议族中,使用(ip地址,协议,端口)来唯一标识不同主机间的进程,(ip地址+端口号)就是套接字

什么是协议:

互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
在这里插入图片描述
tcp/ip模型在osi七层模型的基础上做了简化。

TCP

TCP: 传输控制协议(英语:Transmission Control Protocol,缩写为TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP在客户机和服务器之间建立持续的开放连接,在该连接的生命期内,字节可以通过该连接写出(并且保证顺序正确)。

tcp的三次握手和四次挥手
三次握手

在这里插入图片描述

A 发送一个信号(SYN = 1000),表示 A 想要发起一个连接请求
B 收到这个 SYN,并且返回 ACK = 1001(1 中的 SYN + 1),表示 B 收到了 A 的请求,同时 B 也发出一个 SYN(2000),表示 B 同意开启这个连接
A 收到了 SYN (2000)+ ACK,表示 A 已经知道 B 同意开启连接,发送一个 ACK 给 B,表示“我知道你同意开启连接了”。

四次挥手

在这里插入图片描述

1.A 主动关闭连接,发送 FIN 信号,变为 FIN_WAIT_1 状态,表示不再传送数据,但是可接收数据
2.B 接收到 FIN,被动关闭,发送 ACK,表示已收到 1 的 FIN,进入 CLOSE_WAIT 状态
B 还可以继续发送数据(半关闭)
3.B 发送数据完毕,也要关闭了,发送 FIN,状态变为 LAST_ACK(等待最后一个 ACK)
4.A 收到 FIN,发送 ACK,表示收到了 FIN,进入 TIME_WAIT 状态
B 收到 ACK 之后,成功关闭,进入 CLOSED 状态
A 经过 2MSL 之后,也进入 CLOSED 状态

UDP

UDP是⾯向⽆连接的通讯协议,UDP数据包括⽬的端⼝号和源端⼝号信息, 由于通讯不需要连接,所以可以实现⼴播发送。 UDP传输数据时有⼤⼩限 制,每个被传输的数据报必须限定在64KB之内。 UDP是⼀个不可靠的协 议,发送⽅所发送的数据报并不⼀定以相同的次序到达接收⽅。

UDP⼀般⽤于多点通信和实时的数据业务,⽐如:
语⾳⼴播
视频
QQ
TFTP(简单⽂件传送)
SNMP(简单⽹络管理协议)
DNS(域名解释)

在这里插入图片描述

- - python网络编程 - -

Python 提供了两个级别访问的网络服务。:
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

TCP服务器与客户端

在这里插入图片描述
TCP服务器

使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)。

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。
recv方法接受到的数据是bytes类型,需要decode转成字符转类型。

import socket
# 1. 创建服务端socket对象
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

# 2. 绑定地址和端口(IP:port)
server.bind(('0.0.0.0', 9998))

# 3. 监听是否有客户端连接?listen
server.listen(5)
print('server start .........')
# 4.接收客户端的连接accept
clientSocketObj, clientAddress = server.accept()
# 5. 接收客户端发送的消息
recv_data = clientSocketObj.recv(1024).decode('utf-8')
print("接收到客户端发送的消息:", recv_data)

# 6. 给客户端发送消息
send_data = b'hello client'
clientSocketObj.send(send_data)

# 7. 关闭socket对象
clientSocketObj.close()
server.close()

TCP客户端

import socket
# 1. 创建客户端socket对象
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 2. 连接服务端
client.connect(('172.25.254.197', 9998))
# 3.给服务端发送消息
client.send(b'hello server')
# 4. 接收服务端发送的消息
recv_data = client.recv(1024).decode('utf-8')
print("接收服务端发送的消息:", recv_data)
# 5. 关闭socket对象
client.close()

UDP服务器与客户端

在这里插入图片描述

udp服务器

在创建socket对象时,type参数用来区分tcp连接还是udp连接,默认为SOCK_STREAM(tcp),udp为(SOCK_DGRAM)
udp的接受方法recvfrom返回元组,首位为收到的数据,第二位也是一个元组(ip,端口号)

import socket
# 1. 创建服务端socket对象
udpserver = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)

# 2. 绑定地址和端口(IP:port)
udpserver.bind(('0.0.0.0',23422))

# 3. 接收客户端的消息
recv,addr=udpserver.recvfrom(2048)
redecode=recv.decode('utf-8')
print("收到消息:",redecode)
sendstr=input("me>>:")

#4.向客户端发送消息
senddata=sendstr.encode('utf-8')
udpserver.sendto(senddata,addr)
udp客户端
import socket

udpclient = socket.socket(type=socket.SOCK_DGRAM)
sendstr=input('me>>:')
senddata=sendstr.encode('utf-8')
udpclient.sendto(senddata,('172.25.254.9',23422))
s=udpclient.recvfrom(2048)
print("收到消息:",s[0].decode('utf-8'))

并发服务器

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值