1 TCP-概念版
服务端
import socket
# 1 创建服务端套接字对象
# socket.AF_INET IPV4
# socket.SOCK_STREAM TCP
# socket.SOCK_DGRAM UDP
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 绑定端口号
tcp_server_socket.bind(('192.168.124.7', 8888))
# 3 设置监听
# 参数为允许最大的连接数
tcp_server_socket.listen(1)
# 4 等待接收客户端的连接请求
new_socket, client_connect = tcp_server_socket.accept()
# 5 接收数据
recv_data = new_socket.recv(1024).decode(encoding='utf-8')
print(recv_data)
# 6 发送数据
new_socket.send('<服务器>: 已收到数据'.encode('utf-8'))
# 7 关闭套接字
tcp_server_socket.close()
客户端
import socket
# 1 创建套接字对象
# socket.AF_INET IPV4
# socket.SOCK_STREAM TCP
# socket.SOCK_DGRAM UDP
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 与服务器建立连接
tcp_client_socket.connect(('192.168.124.7', 8888))
# 3 发送数据(必须是字节流类型数据)
tcp_client_socket.send('<客户端>: 请求发送数据'.encode(encoding='utf-8'))
# 4 接收数据
recv_data = tcp_client_socket.recv(1024).decode(encoding='utf-8')
print(recv_data)
# 5 关闭套接字
tcp_client_socket.close()
2 TCP-基础对话版
服务端
import socket
IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888
# TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序
class ServerSocket(object):def __init__(self):# 1 创建服务端套接字对象# socket.AF_INET IPV4# socket.SOCK_STREAM TCP# socket.SOCK_DGRAM UDPself.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用 如果程序执行结束,则让其占用的端口立即释放self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2 绑定端口号self.tcp_server_socket.bind((IPV4_ADDR, IPV4_PORT))
# 3 设置监听# listen 后的套接字属于被动套接字,只负责接收新的客户端的连接请求不能收发消息# 参数为允许最大的连接数self.tcp_server_socket.listen(1)
def start(self):while True:# 4 等待接收客户端的连接请求# 当 TCP 客户端程序和 TCP 服务端程序连接成功后,TCP 服务端程序会产生一个新的套接字,收发客户端消息使用该套接字client_socket, client_connect = self.tcp_server_socket.accept()
while True:# 5 接收数据recv_data = client_socket.recv(1024).decode(encoding='utf-8')# 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0if len(recv_data) <= 0:client_socket.close()print(f'接收到客户端 {client_connect[0]}:{client_connect[1]} 发来的消息: {recv_data}')
# 6 发送数据send_data = input('(请输入消息按 Enter 键发送): ')if send_data in ('q', 'Q'):# 7 关闭 客户-服务 套接字client_socket.close()breakclient_socket.send(send_data.encode('utf-8'))
def __del__(self):# 5 关闭套接字self.tcp_server_socket.close()
if __name__ == '__main__':server_socket = ServerSocket()server_socket.start()
客户端
import socket
IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888
# TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
class ClientSocket():def __init__(self):while True:# 1 创建套接字对象# socket.AF_INET IPV4# socket.SOCK_STREAM TCP# socket.SOCK_DGRAM UDPtcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 与服务器建立连接tcp_client_socket.connect((IPV4_ADDR, IPV4_PORT))
while True:# 3 发送数据(必须是字节流类型数据)send_data = input('(请输入消息按 Enter 键发送): ')if send_data in ('q', 'Q'):# 5 关闭套接字tcp_client_socket.close()returntcp_client_socket.send(send_data.encode(encoding='utf-8'))
# 4 接收数据recv_data = tcp_client_socket.recv(1024).decode(encoding='utf-8')# 当服务端的套接字调用 close 后,客户端的 recv 会解阻塞,返回的数据长度为0if len(recv_data) <= 0:tcp_client_socket.close()returnprint(f'接收到服务端回复的消息: {recv_data}')
if __name__ == '__main__':socket = ClientSocket()