Tcp/Ip编程
服务端
bind(Union) 绑定ip和端口
listen() 启动监听,监听来自客户端的连接
accept() 接收客户端sock
send() 发送信息
recv() 接收信息,阻塞
close() 关闭连接
客户端
connect() 连接服务端
1.0 server
from socket import socket, AF_INET, SOCK_STREAM
import struct
import json
from threading import Thread
class ServerTool(socket):
socks = []
def accept_sock(self):
while True:
sock, addr = self.accept()
print('accept!')
ServerTool.socks.append(sock)
def __init__(self, family, type):
super().__init__(family, type)
self.bind(('127.0.0.1', 8888))
self.listen(5)
print("Server started...")
Thread(target=self.accept_sock).start()
def send_msg(self, msg):
msg_bytes = bytes(msg, encoding='utf8')
msg_dict = {
'size': len(msg_bytes)
}
msg_json_str = json.dumps(msg_dict)
msg_json_str_bytes = bytes(msg_json_str, encoding='utf8')
msg_json_str_bytes_len = struct.pack('i', len(msg_json_str_bytes))
for s in ServerTool.socks:
s.send(msg_json_str_bytes_len)
s.send(msg_json_str_bytes)
s.send(msg_bytes)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
def reader(self):
while True:
self.read_msg()
def read_msg(self):
msg_json_str_bytes_len = self.recv(4)
if len(msg_json_str_bytes_len) < 4:
return None
msg_json_str_bytes_len = struct.unpack('i', msg_json_str_bytes_len)
msg_json_str_bytes = self.recv(msg_json_str_bytes_len[0])
msg_json_str = json.loads(msg_json_str_bytes.decode('utf8'))
msg_bytes = self.recv(msg_json_str['size'])
msg = msg_bytes.decode('utf8')
print('receive:', msg)
with ServerTool(AF_INET, SOCK_STREAM) as server:
msg = None
while True:
msg = input('输入群发内容...')
if msg == 'exit':
break
server.send_msg(msg)
1.0 client
from socket import socket, AF_INET, SOCK_STREAM, _Address
import struct
import json
from typing import Union
from threading import Thread
class ClientTool(socket):
def __init__(self, family, type):
super().__init__(family, type)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
def reader(self):
while True:
self.read_msg()
def read_msg(self):
msg_json_str_bytes_len = self.recv(4)
if len(msg_json_str_bytes_len) < 4:
return None
msg_json_str_bytes_len = struct.unpack('i', msg_json_str_bytes_len)
msg_json_str_bytes = self.recv(msg_json_str_bytes_len[0])
msg_json_str = json.loads(msg_json_str_bytes.decode('utf8'))
msg_bytes = self.recv(msg_json_str['size'])
msg = msg_bytes.decode('utf8')
print('receive:', msg)
def connect(self, address: Union[_Address, bytes]) -> None:
super().connect(address)
Thread(target=self.reader).start()
with ClientTool(AF_INET, SOCK_STREAM) as client:
client.connect(('127.0.0.1', 8888))
while True:
msg = input('输入群发内容...')
if msg == 'exit':
break
client.send_msg(msg)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律