编辑
2024-03-30
Python
00

目录

socket介绍
什么是 Socket?
Socket 的分类
TCP Python程序
UDP Python程序

socket介绍

什么是 Socket?

  • Socket 是一种网络通信的端点,可以看作是一个通讯通道的一个端口。通过 Socket,不同的应用程序可以在网络上相互通信。Socket 是操作系统提供的一种接口,应用程序通过它可以发送和接收数据。

image.png

Socket 的分类

  • Socket 可以根据传输协议分类为:
  1. 流式套接字(Stream Socket):
  • 基于 TCP(Transmission Control Protocol)协议,提供面向连接的、可靠的字节流服务。
  • 使用场景:需要保证数据顺序和完整性的应用,比如 HTTP、FTP。
  1. 数据报套接字(Datagram Socket):
  • 基于 UDP(User Datagram Protocol)协议,提供无连接、不可靠的数据传输服务。
  • 使用场景:需要快速传输数据且不要求数据可靠性的应用,比如视频流、在线游戏。

TCP Python程序

  • 服务端:
python
# TCP 服务端程序 server.py # 导入socket 库 from socket import * # 主机地址为空字符串, 表示绑定本机所有网络接口ip地址 # 等待客户端来连接 IP = '127.0.0.1' # 端口号 PORT = 50000 # 定义一次从socket缓冲区最多读入512个字节数据 BUFLEN = 512 # 实例化一个socket对象 # 参数 AF_INET 表示该socket网络层使用IP协议 # 参数 SOCK_STREAM 表示该socket传输层使用TCP协议 # SOCK_DGRAM: 传输层使用UDP协议 listenSocket = socket(AF_INET, SOCK_STREAM) # socket绑定地址和端口 listenSocket.bind((IP, PORT)) # 使socket处于监听状态, 等待客户端的连接请求 # 参数 8 表示 最多接受多少个等待连接的客户端 listenSocket.listen(8) print(f'Server is listening on port {PORT}') dataSocket, addr = listenSocket.accept() print(f'Accepted connection from {addr}') while True: # 尝试读取对方发送的消息 # BUFLEN 指定从接收缓冲里最多读取多少字节 recved = dataSocket.recv(BUFLEN) # 如果返回空bytes, 表示对方关闭了连接 # 退出循环, 结束消息收发 if not recved: break # 读取的字节数据是bytes类型, 需要解码为字符串 info = recved.decode() print(f'Received {info}') # 发送的数据类型必须是bytes, 所以要编码 dataSocket.send(f'{info}'.encode()) # 服务端也调用close()关闭socket dataSocket.close() listenSocket.close()
  • 客户端:
python
# TCP 客户端程序 client.py from socket import * IP = '127.0.0.1' SERVER_PORT = 50000 BUFFER = 512 # 实例化一个socket对象, 指明协议 # AF_INIT: 网络层使用IP协议 # SOCKET_STREAM: 传输层使用TCP协议 dataSocket = socket(AF_INET, SOCK_STREAM) socket() # 连接服务端socket dataSocket.connect((IP, SERVER_PORT)) while True: # 从终端读入用户输入的字符串 toSend = input(">>>") if toSend == "exit": break # 发送消息, 也要编码为 bytes dataSocket.send(toSend.encode()) # 等待接收服务端的消息 recved = dataSocket.recv(BUFFER) # 如果返回空bytes, 表示对方关闭了连接 if not recved: break # 打印读取的信息 print(recved.decode()) dataSocket.close()

UDP Python程序

  • 服务端:
python
# server.py import socket # 服务器的IP和端口号 SERVER_IP = '127.0.0.1' SERVER_PORT = 5000 BUFFER = 1024 # 创建一个socket对象,使用UDP协议 serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定到服务器的IP和端口 serverSocket.bind((SERVER_IP, SERVER_PORT)) print("The server is ready to receive") while True: # 使用recvfrom方法接收客户端发送的数据,返回值是一个元组,第一个元素是数据,第二个元素是客户端的地址 message, clientAddress = serverSocket.recvfrom(BUFFER) # 解码客户端发送的数据 message = message.decode() print(f"Received from client: {message}") # 将数据转换为大写 modifiedMessage = message.upper() # 使用sendto方法将数据发送回客户端 serverSocket.sendto(modifiedMessage.encode(), clientAddress)
  • 客户端:
python
# client.py import socket # 服务器的IP和端口号 SERVER_IP = '127.0.0.1' SERVER_PORT = 5000 BUFFER = 1024 # 创建一个socket对象,使用UDP协议 clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: # 从终端读入用户输入的字符串 message = input('Input lowercase sentence:') if message == "exit": break # 将用户输入的字符串编码为bytes,然后发送到服务器 clientSocket.sendto(message.encode(), (SERVER_IP, SERVER_PORT)) # 使用recvfrom方法接收服务器发送的数据,返回值是一个元组,第一个元素是数据,第二个元素是服务器的地址 modifiedMessage, serverAddress = clientSocket.recvfrom(BUFFER) # 打印服务器返回的数据 print(modifiedMessage.decode()) clientSocket.close()
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:GYC

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!