RobotKernal-UESTC/Code/MowingRobot/pibot_ros/ros_ws/service.py

68 lines
2.5 KiB
Python
Raw Normal View History

2024-06-20 15:40:49 +08:00
import socket
import threading
import subprocess
import netifaces
def create_server_socket(host, port):
socket_server = socket.socket()
socket_server.bind((host, port))
socket_server.listen(5)
print(f"服务端已启动,地址{host},端口{port}")
print(f"正在等待客户端连接...")
# 开启多线程,收发来自多个客户端的数据
num = 0 # 标记客户端的编号
while True:
num += 1
conn, address = socket_server.accept()
print(f"服务端已接受到客户端 {num}号 的连接请求,客户端信息:{address}")
client_handler = threading.Thread(target=handle_client, args=(conn, address, num))
client_handler.start()
# 处理收发数据
def handle_client(conn, address, num):
while True:
# 接收客户端发来的数据
data_from_client: str = conn.recv(1024).decode("UTF-8")
print(f"客户端 {num}号:{address}发来的消息是:{data_from_client}")
# 发送消息到客户端
msg = input(f"请输入你要回复客户端 {num}号:{address}的消息:")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8")) # encode将字符串编码为字节数组对象
conn.close()
# def handle_client(conn, address, client_num):
# try:
# while True:
# data_from_client = conn.recv(1024).decode("UTF-8")
# if not data_from_client:
# break
# print(f"客户端 {client_num} 号({address}) 发来的消息是:{data_from_client}")
# if data_from_client.strip() == '1':
# print("执行 roscore 命令...")
# subprocess.run(['roscore'])
# else:
# msg = input(f"请输入你要回复客户端 {client_num} 号({address}) 的消息:")
# if msg.lower() == 'exit':
# break
# conn.send(msg.encode("UTF-8"))
# except Exception as e:
# print(f"客户端 {client_num} 号({address}) 处理时发生错误:{e}")
# finally:
# conn.close()
# print(f"客户端 {client_num} 号({address}) 已断开连接。")
if __name__ == '__main__':
# 获取本机(计算机)名
hostname = socket.gethostname()
# 获取本机计算机ip
ip = socket.gethostbyname(hostname)
print(hostname, ip)
server_host = ip
server_port = int(input("请输入服务端port:"))
create_server_socket(server_host, server_port)