64 行
2.4 KiB
Python
64 行
2.4 KiB
Python
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() |