1.socket
1.1 socket的由来
socket是一种计算机网络数据结构,中文译名:套接字
一般将程序中的套接字分为两种
面向文件的套接字:通过文件进行数据交互
面向网络的套接字:通过网络进行数据交互
1.2 python中的套接字
在网络套接字交互过程中,出现了两种类型的套接字模型
面向连接的套接字模型:TCP
面向无连接的套接字模型:UDP
1.3 基本语法结构
socket.socket(socket_family, socket_type, protocal=0)
socket_family # socket地址家族,AF_UNIX/AF_LOCAL 或者AF_INET
socket_type # socket连接类型
protocal # 传输协议,一般不用设置
# 创建TCP协议的套接字socket对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建UDP协议的套接字socket对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1.4 socket套接字常用操作
s.bind() # 绑定(主机名称,端口)到一个套接字上
s.listen() # 设置并启动TCP监听
s.accept() # 等待客户端连接
s.connect() # 连接指定服务器
s.recv() # 接收TCP消息
s.send() # 发送TCP消息
s.recvfrom() # 接收UDP消息
s.sendto() # 发送UDP消息
s.close() # 关闭套接字对象
2. TCP 编程
2.1 什么是TCP
TCP:Transmission Control Protocal 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议
2.2 TCP模型中的三次握手四次挥手
三次握手建立连接
A->B: 发送一个寻址请求码seq=100; B->A:返回一个应答 ack=101
A->B: 发送一个确认请求码seq=101,确认连接; B->A:返回一个应答 ack=300
A->B: 发送一个连接请求码seq=300; B->A:返回一个应答 ack=80
A和B之间开始进行数据交互
四次挥手断开连接
A->B: 发送一个数据验证请求码seq=100; B->A:返回一个应答 ack=101
A->B: 发送一个传输结束标记seq=101; B->A:返回一个应答 ack=200
A->B: 发送一个确认结束标记seq=200; B->A:返回一个应答 ack=300
A->B: 发送一个连接断开标记seq=300; B->A:返回断开连接应答 ack=400
3.TCP 服务端开发
import socket
# 定义服务器信息
print("初始化服务器信息")
HOST = ''
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024
# 创建TCP服务端套接字
print("创建服务端套接字")
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定主机
print("初始化服务器")
tcp_socket.bind(ADDRESS)
# 启动监听
print("开始监听")
tcp_socket.listen(128)
# 等待连接
while True:
# 等待客户端的接入
print("等待客户端接入.......")
client_socket, client_address = tcp_socket.accept()
print("客户端{}接入成功".format(client_address))
# 发送欢迎消息
client_socket.send("欢迎访问服务器".encode("utf-8"))
# 收发消息
while True:
# 接受消息
msg = client_socket.recv(BUFFER)
print("client{}:{}".format(client_address, msg.decode("utf-8")))
if msg == b'bye':
print("客户端即将推出")
client_socket.close()
break
# 发送消息
info = input("server enter message:")
client_socket.send(info.encode("utf-8"))
4.TCP客户端开发
import socket
print("定义要连接的目标服务器信息")
HOST = '192.168.11.202'
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024
print("创建TCP客户端套接字")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("连接目标主机")
client_socket.connect(ADDRESS)
print("连接成功,收发消息>>>>>>")
while True:
# 接受服务器欢迎消息
msg = client_socket.recv(BUFFER)
print("server: {}".format(msg.decode("utf-8")))
if info == "bye":
print("准备退出")
client_socket.close()
break
# 发送消息
info = input("client enter message: ")
client_socket.send(info.encode("utf-8"))