网络编程之Socket
目录
什么是Socket
TCP服务端流程
TCP客户端流程
UDP服务端流程
UDP客户端流程
什么是Socket
Socket是位于应用层与传输层之间的一个抽象层,可用于不同的网络协议(如TCP、UDP等)它允许应用程序创建一个与网络上的其他主机进行通信的端点
TCP服务端流程
-
服务端流程
- 首先服务端先创建并初始化Socket
# 创建Socket Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- 绑定地址和端口:将Socket绑定到本地的IP地址和端口上,这个IP地址就将作为服务器的监听地址
# 绑定服务器和端口号 servers_addr = ('127.0.0.1', 8080) Socket.bind(servers_addr)
- 监听连接请求:等待客户端的连接请求
# 监听客户端请求 最大连接数为5 Socket.listen(5) print('服务器启动成功,等待客户端连接...')while True:# 接受数据client_socket, client_addr = Socket.accept()print('与客户端建立连接', client_addr)
- 数据交换:当连接成功后,便可以和客户端互相发送信息并处理
# 数据交换 while True:data = Socket.recv(1024) # 最大1024字节if len(data) < 1:print('关闭服务')break# 接受客户器端传来的数据print(data.decode())# 向客户端发送数据sen = input('')Socket.sendall(sen.encode())
- 关闭连接:当通信结束后可以通过关闭Socket来断开连接,并释放资源
Socket.close() print("已关闭连接")
TCP客户端流程
-
客户端流程
- 创建并初始化Socket
# 创建Socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 连接服务器IP以及端口
# 服务器地址和端口 server_address = ('localhost', 8080)
- 连接服务器
# 连接服务器 client_socket.connect(server_address) print('已连接到服务器:', server_address)
- 连接成功后与服务端交换数据并处理
while True:# 发送数据message = input('>>>>')client_socket.sendall(message.encode())# 接收响应response = client_socket.recv(1024)print('服务器响应:', response.decode())
- 关闭连接
client_socket.close()
UDP服务端流程
UDP 是无连接的协议,因此不需要像 TCP 那样先建立连接再进行通信
import socket# 创建 Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口
server_address = ('127.0.0.1', 9000)
server_socket.bind(server_address)print('服务器启动成功,等待客户端数据...')while True:# 接收数据data, client_address = server_socket.recvfrom(1024) # 最大1024字节# 处理接收到的数据print(f'来自客户端 {client_address} 的消息:', data.decode())# 向客户端发送响应response = input('请输入要发送给客户端的消息: ')server_socket.sendto(response.encode(), client_address)# server_socket.close()
UDP客户端流程
import socket# 创建 Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址和端口
server_address = ('127.0.0.1', 9000)while True:# 发送数据message = input("请输入要发送给服务器的消息: ")client_socket.sendto(message.encode(), server_address)# 接收响应response, server_address = client_socket.recvfrom(1024) # 最大1024字节print('服务器响应:', response.decode())# client_socket.close()