目录
1:网络基础
网络编程是指通过计算机网络进行信息交换与通信的技术。网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。在计算机网络中,最常见的两种通信协议是 TCP 和 UDP。
1.1:TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议,提供可靠的、按顺序到达的通信服务。TCP 协议通过三次握手建立连接,并通过四次挥手断开连接。其主要特点如下:
面向连接:通信前需建立连接(三次握手),结束后释放连接(四次挥手)。
可靠传输:通过确认、重传、流量控制和拥塞控制确保数据无差错、不丢失、不重复且有序。
全双工通信:支持双向数据传输。
字节流传输:数据被视为无结构的字节流,无固定边界。
1.2:UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它的主要特点是简单、快速,但不保证数据的可靠性和顺序。UDP 协议的主要特点如下:
无连接:无需建立连接,直接发送数据。
不可靠传输:不保证数据到达、顺序或完整性,无重传机制。
高效:首部开销小(8字节),传输速度快。
面向报文:保留数据边界,每次发送一个完整报文。
1.3:socket简介
-
定义:Socket是应用层与传输层之间的抽象接口,提供网络通信的编程接口。
-
作用:实现不同主机或同一主机上的进程间通信。
-
类型:
-
流式Socket(SOCK_STREAM):基于TCP,可靠、面向连接。
-
数据报Socket(SOCK_DGRAM):基于UDP,无连接、不可靠。
-
原始Socket(SOCK_RAW) :直接访问底层协议(如IP、ICMP)。
-
-
工作流程(以TCP为例):
-
服务端 :创建Socket → 绑定IP和端口(
bind
)→ 监听(listen
)→ 接受连接(accept
)。 -
客户端 :创建Socket → 连接服务端(
connect
)。 -
数据传输 :双方通过
send
/recv
通信。 -
关闭连接 :调用
close
释放资源。
-
2:TCP编程
2.1:TCP客户端示例
cpp
import socket
def tcp_client():
# 创建一个TCP客户端socket
# AF_INET表示IPv4协议,SOCK_STREAM表示TCP协议
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器(IP和端口)
client_socket.connect(('127.0.0.1', 12345))
# 发送数据
message = 'Hello, Server'
client_socket.send (message.encode ('utf-8')) # 发送数据时需要进行编码
#接收服务器响应
response = client_socket.recv (1024) # 接收最多 1024 字节的数据
print ('Received from server:', response.decode ('utf-8')) # 接收到的数据需要解码
#关闭连接
client_socket.close()
if name == 'main':
tcp_client()
代码解析:
- socket.socket (socket.AF_INET, socket.SOCK_STREAM):创建一个 TCP 客户端 Socket,使用 IPv4 地址族(AF_INET)和 TCP 协议(SOCK_STREAM)。
- client_socket.connect (('127.0.0.1', 12345)):通过 IP 地址和端口连接到服务器。
- client_socket.send ():将数据发送到服务器,数据需要进行编码(encode ('utf-8'))。
- client_socket.recv ():接收来自服务器的数据,最多接收 1024 字节。
- client_socket.close ():关闭客户端 Socket 连接。
2.2:TCP服务器示例
cpp
import socket
def tcp_server():
#创建一个 TCP 服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定服务器地址和端口
server_socket.bind(('127.0.0.1', 12345))
#开始监听连接,最大连接数为 5
server_socket.listen(5)
print('Server is listening...')
while True:
#接受客户端连接
client_socket, client_address = server_socket.accept()
print(f'Connection from {client_address}')
#接收客户端消息
message = client_socket.recv(1024)
print(f'Received message: {message.decode("utf-8")}')
#发送响应
client_socket.send (b'Hello, Client') # 发送响应数据,需要编码成字节形式
#关闭连接
client_socket.close()
if name == 'main':
tcp_server()
代码解析:
- server_socket.bind (('127.0.0.1', 12345)): 绑定服务器的 IP 地址和端口。
- server_socket.listen (5): 开始监听连接,最大连接数为 5。
- server_socket.accept (): 接受客户端连接。
- client_socket.recv (1024): 接收客户端消息。
- client_socket.send (b'Hello, Client'): 向客户端发送响应消息。
- client_socket.close (): 关闭与客户端的连接。
3:UDP编程
3.1:UDP客户端示例
cpp
import socket
def udp_client():
# 创建UDP客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
message = 'Hello, UDP Server'
client_socket.sendto(message.encode('utf-8'), ('127.0.0.1', 12345)) # 发送数据并指定目标地址
# 接收服务器响应
response, server_address = client_socket.recvfrom(1024) # 接收数据和服务器地址
print('Received from server:', response.decode('utf-8'))
# 关闭socket
client_socket.close()
if __name__ == '__main__':
udp_client()
代码解析:
- socket.socket (socket.AF_INET, socket.SOCK_DGRAM): 创建 UDP 客户端 Socket。
- client_socket.sendto (): 发送数据到指定的目标地址和端口。
- client_socket.recvfrom (): 接收来自服务器的响应,返回接收到的数据和服务器地址。
3.2:UDP服务器示例
cpp
import socket
def udp_server():
# 创建UDP服务器socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定服务器地址和端口
server_socket.bind(('127.0.0.1', 12345))
print('Server is listening...')
while True:
# 接收客户端消息
message, client_address = server_socket.recvfrom(1024) # 接收数据和客户端地址
print(f'Received message: {message.decode("utf-8")}')
# 发送响应
server_socket.sendto(b'Hello, UDP Client', client_address) # 向客户端发送响应
if __name__ == '__main__':
udp_server()
代码解析:
- server_socket.bind (('127.0.0.1', 12345)): 绑定服务器的 IP 地址和端口。
- server_socket.recvfrom (1024): 接收来自客户端的数据,并返回数据和客户端地址。
- server_socket.sendto (): 向指定客户端地址发送响应数据。
4:小案例:简易聊天应用
4.1:TCP聊天服务器
101(服务器):
cpp
vim server.com
import socket #导入模块
host='192.168.10.101' #定义监听内容
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#socket.AF_INET网络层协议
#socket.SOCK_STREAM传输层协议
s.bind((host,port))
s.listen(1)
sock,addr=s.accept()
print('建立连接成功')
info=sock.recv(1024).decode()
while info !='bye':
if info:
print('收到的信息是:'+info)
send_data=input('请输入你要发送的信息:')
send_data=str(send_data)
sock.send(send_data.encode())
if send_data=='bye':
break
info=sock.recv(1024).decode()
sock.close()
s.close()
#运行server.py
python3 server.py
4.2:TCP聊天客户端
102(客户端):
cpp
vim client.py
s=socket.socket()
host='192.168.10.101' #定义监听内容
port=12345
s.connect((host,port))
print('已经建立连接')
info=''
while info !='bye':
send_data=input('请输入你要发送的信息:')
send_data=str(send_data)
s.send(send_data.encode())
if send_data=='bye':
break
info=s.recv(1024).decode()
print('收到的信息是:'+info)
s.close()
#先运行server.py
python3 server.py
#再运行client.py
python3 client.py