|
@@ -7,29 +7,31 @@ from threading import Thread
|
|
|
from datetime import datetime
|
|
|
|
|
|
# 广播端口
|
|
|
-port_broadcast = 8888
|
|
|
+broadcast_port = 8888
|
|
|
|
|
|
# 管理端口
|
|
|
-port_manager = 9999
|
|
|
-
|
|
|
-server_info = json.dumps({'port_manager': port_manager})
|
|
|
+manager_port = 9999
|
|
|
|
|
|
|
|
|
# 监听广播消息
|
|
|
def listen_broadcast():
|
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
|
|
- s.bind(('', port_broadcast))
|
|
|
- logging.info('Listening broadcast at %s' % str(s.getsockname()))
|
|
|
+ s.bind(('', broadcast_port))
|
|
|
+ logging.info('* Listening broadcast at %s' % str(s.getsockname()))
|
|
|
|
|
|
while True:
|
|
|
data, address = s.recvfrom(2048)
|
|
|
# 接收到客户端广播消息
|
|
|
client_info = json.loads(data.decode('utf-8'))
|
|
|
- logging.info('recv --> %s:%s' % (address, client_info))
|
|
|
-
|
|
|
- # 将服务器信息发送给客户端
|
|
|
- logging.info('send --> %s:%s' % (address, server_info))
|
|
|
+ logging.info('broadcast msg: %s from %s' % (client_info, address[0]))
|
|
|
+
|
|
|
+ # 将服务端配置信息发送给客户端
|
|
|
+ server_info = json.dumps({
|
|
|
+ 'version': '0.1',
|
|
|
+ 'manager_port': manager_port
|
|
|
+ })
|
|
|
+ logging.info('send to %s, %s' % (address[0], server_info))
|
|
|
s.sendto(server_info.encode('utf-8'), address)
|
|
|
|
|
|
|
|
@@ -39,12 +41,12 @@ def message_handle(client_conn, client_info):
|
|
|
try:
|
|
|
msg_bytes = client_conn.recv(2048)
|
|
|
msg_str = msg_bytes.decode(encoding='utf8')
|
|
|
- logging.info('recv --> %s' % str(msg_str))
|
|
|
+ logging.info('recv from %s, %s' % (client_info[0], str(msg_str)))
|
|
|
# msg_json = json.loads(msg_str)
|
|
|
str_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
client_conn.send(str_now.encode())
|
|
|
except Exception as e:
|
|
|
- logging.error(e)
|
|
|
+ logging.warning('client %s offline, %s' % (client_info[0], e))
|
|
|
break
|
|
|
|
|
|
|
|
@@ -64,23 +66,26 @@ def init_logging(log_filename):
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
- init_logging('run.log')
|
|
|
+ init_logging('server.log')
|
|
|
# 启动接收广播线程
|
|
|
thread_broadcast = Thread(target=listen_broadcast)
|
|
|
thread_broadcast.setDaemon(True)
|
|
|
thread_broadcast.start()
|
|
|
|
|
|
# 服务端监听
|
|
|
- socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
- socket_server.bind(('', port_manager))
|
|
|
- socket_server.listen(255)
|
|
|
- logging.info('Server start at %s, wait for client connecting...' % str(socket_server.getsockname()))
|
|
|
-
|
|
|
- while True:
|
|
|
- client, info = socket_server.accept()
|
|
|
- logging.info('client %s connect success' % str(info))
|
|
|
-
|
|
|
- # 为每个客户端启一个线程
|
|
|
- thread = Thread(target=message_handle, args=(client, info))
|
|
|
- thread.setDaemon(True)
|
|
|
- thread.start()
|
|
|
+ try:
|
|
|
+ socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
+ # 立即释放端口
|
|
|
+ socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
+ socket_server.bind(('', manager_port))
|
|
|
+ socket_server.listen(128)
|
|
|
+ logging.info('* Server start at %s, waiting for client...' % str(socket_server.getsockname()))
|
|
|
+
|
|
|
+ while True:
|
|
|
+ # 为每个客户端启一个线程
|
|
|
+ client, info = socket_server.accept()
|
|
|
+ thread = Thread(target=message_handle, args=(client, info))
|
|
|
+ thread.setDaemon(True)
|
|
|
+ thread.start()
|
|
|
+ except KeyboardInterrupt as ki:
|
|
|
+ logging.warning('KeyboardInterrupt %s' % ki)
|