feat: 添加 TCP 服务端与客户端示例项目
包含基于 Python socket 的多线程 TCP 服务端、交互式客户端、README 文档、MIT 许可证及 .gitignore。
这个提交包含在:
+64
@@ -0,0 +1,64 @@
|
||||
import socket
|
||||
|
||||
def tcp_client():
|
||||
# --- 配置区域 ---
|
||||
# 服务器的 IP 地址或域名
|
||||
HOST = '127.0.0.1' # 本地测试用;跨机器测试请改为服务端实际 IP
|
||||
# 服务器的端口号
|
||||
PORT = 30008 # 请确保此端口与服务器监听的端口一致
|
||||
# -----------------
|
||||
|
||||
try:
|
||||
# 1. 创建 TCP Socket 对象
|
||||
# AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用 TCP 协议
|
||||
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
|
||||
# 2. 连接到服务器
|
||||
print(f"正在尝试连接到 {HOST}:{PORT} ...")
|
||||
client_socket.connect((HOST, PORT))
|
||||
print("✅ 连接成功!请输入要发送的消息(输入 'exit' 退出):")
|
||||
|
||||
# 3. 循环发送消息
|
||||
while True:
|
||||
message = input("我: ")
|
||||
|
||||
# 检查是否退出
|
||||
if message.lower() == 'exit':
|
||||
print("正在断开连接...")
|
||||
break
|
||||
|
||||
# 4. 发送数据
|
||||
# 网络传输的是字节流,所以需要将字符串编码为 bytes
|
||||
# Netty服务端期望以换行符结尾的消息
|
||||
client_socket.sendall(message.encode('utf-8')+b'\n')
|
||||
print("📤 消息已发送。")
|
||||
|
||||
# 5. 接收服务端的响应
|
||||
try:
|
||||
# 设置超时时间,避免无限等待
|
||||
client_socket.settimeout(5.0)
|
||||
response = client_socket.recv(4096)
|
||||
if response:
|
||||
# 去除末尾的换行符并解码
|
||||
response_str = response.decode('utf-8').rstrip('\n')
|
||||
print(f"📥 服务器响应: {response_str}")
|
||||
else:
|
||||
print("⚠️ 服务端未返回响应")
|
||||
except socket.timeout:
|
||||
print("⚠️ 等待服务端响应超时")
|
||||
finally:
|
||||
# 恢复默认阻塞模式
|
||||
client_socket.settimeout(None)
|
||||
|
||||
except ConnectionRefusedError:
|
||||
print(f"❌ 连接失败:无法连接到 {HOST}:{PORT}。请确认服务器是否已启动且端口正确。")
|
||||
except Exception as e:
|
||||
print(f"❌ 发生错误:{e}")
|
||||
finally:
|
||||
# 5. 关闭连接
|
||||
# 无论是否发生异常,都确保套接字被关闭
|
||||
client_socket.close()
|
||||
print("连接已关闭。")
|
||||
|
||||
if __name__ == "__main__":
|
||||
tcp_client()
|
||||
在新工单中引用
屏蔽一个用户