协议即规则,就好比汽车上路要遵守交通规则一样,为了使全世界不同类型的计算机都可以连接起来,所以制定了一套全球通用的通信协议Internet协议。有了Internet协议,任何私有网络,只要支持这个协议,就可以接入互联网
IP协议是整个TCP/IP协议族的核心
IP地址就是互联网上计算机的唯一标识
目前的IP地址有两种表示方式,即IPv4和IPv6
在命令行下使用ipconfig命令可以查看本机的IP地址
TCP(Transmission Control Protocol)协议:即传输控制协议,是建立在IP协议基础之上的。
TCP协议负责两台计算机之间建立可靠连接,保证数据包按顺序发送到。
它是一种可靠的、一对一的、面向有连接的通信协议。
TCP协议 | UDP协议 | |
---|---|---|
连接方面 | 面向连接的 | 面向无连接的 |
安全方面 | 传输消息可靠、不丢失、按顺序到达 | 无法保证不丢包 |
传输效率方面 | 传输效率相对较低 | 传输效率高 |
连接对象数量方面 | 只能是点对点、一对一 | 支持一对一、一对多、多对多的交互通讯 |
我们编写网络通讯程序,就会用到这个套接字
Socket对象的常用方法
方法名称 | 功能描述 |
---|---|
bind((ip,port)) | 绑定IP地址和端口 |
listen(N) | 开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5 |
accept() | 被动接收TCP客户端连接,阻塞式 |
connect((ip, port)) | 主动初始化TCP服务器连接 |
recv(size) | 接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量 |
send(str) | 发送TCP数据,返回值是要发送的字节数量 |
sendall(str) | 完整发送TCP数据,将str中的数据发送到连接的套接字,返回之前尝试发送的所有数据,如果成功为None,失败抛出异常 |
recvfrom() | 接收UDP数据,返回值为一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址 |
sendto(data,(ip,port)) | 发送UDP数据,返回值是发送的字节数 |
close() | 关闭套接字 |
TCP编程客户端与服务器启动运行有先后,先启动运行服务器端,再启动运行客户端,连接建立之后,双方谁先发送数据均可
pythonfrom socket import socket, AF_INET, SOCK_STREAM
# AF_INET 用于Internet之间的进程通讯
# SOCK_STREAM 表示的用的TCP协议编程
# (1)创建 socket 对象
server_socket = socket(AF_INET, SOCK_STREAM)
# (2)绑定IP地址和端口
ip = '127.0.0.1' # 等同于local
port = 8888 # 端口
server_socket.bind((ip, port))
# (3)使用 listen() 开始监听
server_socket.listen(5)
print('服务器已启动')
# (4)等待客户端的连接
client_socket, client_addr = server_socket.accept() # 系列解包赋值
# (5)接收来自客户端的数据
data = client_socket.recv(1024)
print('客户端发送过来的数据为:', data.decode('utf-8')) # 要求客户端发过来的数据是使用utf-8进行编码的
# (6)关闭socket
server_socket.close()
使用 socket 类创建一个套接字对象
使用 connect((host, port)) 设置连接的主机IP和主机设置的端口号
使用 recv()/send() 方法接收/发送数据
使用 close() 关闭套接字
pythonimport socket
# (1)创建socket对象
client_socket = socket.socket() # 客户端不需要参数
# (2)IP地址和主机端口,向服务器端发送连接请求
ip = '127.0.0.1'
port = 8888
client_socket.connect((ip, port))
print('-------与服务器连接建立成功-------')
# (3)发送数据
client_socket.send('Welcome to python world'.encode('utf-8'))
# (4)关闭
client_socket.close()
print('发送完毕')
python# 导入socket
import socket
# (1)创建 socket 对象
socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# (2)绑定IP地址和端口
socket_obj.bind(('127.0.0.1', 8888))
# (3)设置最大的连接数量
socket_obj.listen(5)
# (4)等待客户端的TCP连接
client_socket, client_addr = socket_obj.accept()
# (5)接收数据
info = socket_obj.recv(1024).decode('utf-8') # while 循环的四个步骤 info 是初始化变量
while info != 'bye': # 条件判断
if info != '':
print('接收到的数据是:', info)
# 准备发送的数据
data = input('请输入要发送的数据:')
# 服务端回复客户端
socket_obj.send(data.encode('utf-8'))
if data == 'bye':
break # 19行到27行是循环
info = socket_obj.recv(1024).decode('utf-8') # 改变变量
# (6)关闭socket
client_socket.close()
socket_obj.close()
pythonimport socket
# (1)创建socket对象
client_socket = socket.socket()
# (2)IP地址和主机端口
client_socket.connect(('127.0.0.1', 8888))
print('-------服务器连接建立成功-------')
# (3)客户端先发送数据
info = ''
while info != 'bye':
send_data = input('请客户端输入要发送的数据')
client_socket.send(send_data.encode('utf-8'))
# 判断
if info == 'bye':
break
# 接收数据
info = client_socket.recv(1024).decode('utf-8')
print('收到服务器的响应数据是:', info)
# (4)关闭
client_socket.close()
UDP协议又被称为用户数据包协议(User Datagram Protocol),它是面向无连接的协议,只要知道对方的IP地址和端口,就可以直接发送数据包,由于是面向无连接的,所以无法保证数据一定会到达接收方。
UDP客户端和服务器端通讯模型
UDP编程客户端发送方代码
pythonfrom socket import socket, AF_INET, SOCK_DGRAM
# (1)创建socket对象
send_socket = socket(AF_INET, SOCK_DGRAM)
# (2)准备发送数据
data = input('请输入要发送的数据:')
# (3)指定接收方的ip和端口
ip_port = ('127.0.0.1', 8888)
# (4)发送数据
send_socket.sendto(data.encode('utf-8'), ip_port)
# 接收来自接收方的回复数据
recv_data, addr = send_socket.recvfrom(1024)
print('接收到的数据为:', recv_data.decode('utf-8'))
# (5)关闭socket
send_socket.close()
UDP编程服务端接收方代码
pythonfrom socket import socket, AF_INET, SOCK_DGRAM
# (1)创建socket对象
recv_socket = socket(AF_INET, SOCK_DGRAM)
# (2)绑定ip地址和端口
recv_socket.bind(('127.0.0.1', 8888))
# (3)接收来自发送方的数据
recv_data, addr = recv_socket.recvfrom(1024)
print('接收到的数据为:', recv_data.decode('utf-8'))
# (4)准备回复对方的数据
data = input('请输入要回复的数据')
# (5)回复
recv_socket.sendto(data.encode('utf-8'), addr)
# (6)关闭
recv_socket.close()
UDP编程接收方与发送方启动运行无先后,但先启动运行发送方,数据包会丢失
客服人员服务端的代码
pythonfrom socket import socket, AF_INET, SOCK_DGRAM
# (1)创建socket对象
recv_socket = socket(AF_INET, SOCK_DGRAM)
# (2)绑定ip地址和端口
recv_socket.bind(('127.0.0.1', 8888))
while True:
# (3) 接收发送过来的数据
recv_data, addr = recv_socket.recvfrom(1024)
print('客户说:', recv_data.decode('utf-8'))
if recv_data.decode('utf-8') == 'bye':
break
# (4)准备回复对方的数据
data = input('客服回:')
# (5)发送
recv_socket.sendto(data.encode('utf-8'), addr)
# (6)关闭socket对象
recv_socket.close()
客户端代码
pythonfrom socket import socket, AF_INET, SOCK_DGRAM
# (1)创建socket对象
send_socket = socket(AF_INET, SOCK_DGRAM)
while True:
# (2)准备发送的数据
data = input('客户说:')
# (3)发送
send_socket.sendto(data.encode('utf-8'), ('127.0.0.1', 8888))
if data == 'bye':
break
# (4)接收来自客服人员回复的信息
recv_data, addr = send_socket.recvfrom(1024)
print('客服回:', recv_data.decode('utf-8'))
# (5)关闭
send_socket.close()
本文作者:柯南
本文链接:
版权声明:©2024 柯南 All rights reserved.