我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c,如果客户端和客户端是通过 fork 创建的并且具有相同的套接字描述符,那么如何从客户端向客户端发送消息。没有...
我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c如果它们是通过 fork 创建的并且具有相同的套接字描述符,则如何从客户端向客户端发送消息。
无论我如何尝试发送消息,它都会出现在发送消息的同一控制台窗口中
我正在开发一个简单的客户端/服务器应用程序,它需要一个入口点(从外部进程调用);为了简单起见,当前的架构有点像这样:Client.py ...
我正在开发一个简单的客户端/服务器应用程序,它需要一个入口点(从外部进程调用);为了简单起见,当前的架构有点像这样:
Client.py
<-- 这是入口点
Server.py
<-- 这需要在后台运行
Shared.py
<-- 共享/公共变量/对象
...
里面 Shared.py
有一些共享变量/信息(例如主机名、端口、密钥等),还有程序中使用的各种记录器的设置。客户端和服务器通过 multiprocessing.connection
套接字句柄进行通信。
我无法改变这个应用程序只有一个入口点的事实;因此,在里面 Client.py
有一行这样的代码: Popen([sys.executable, 'Server.py')
这应该在单独的进程中启动另一个解释器。
这是因为在最终版本中,这将需要作为(实际上是两个)可执行文件独立发布,并通过对 getattr(sys, 'frozen', False)
客户端/服务器的运行时检查来确定它是从实时解释器运行还是捆绑应用程序运行。
事实是,如果我关闭(终止)第一个解释器,则“服务器”也会停止运行。这是因为文件 Shared.py
是从客户端和服务器导入的吗?此文件包含记录器对象,并且在客户端和服务器中,该文件都作为星型导入导入。
我实际上需要让 Server.py
即使在 执行完毕后仍继续运行 Client.py
(这样即使服务器仍在运行,它也会向调用进程返回一个值),但我搞不懂。解决脚本对 中包含的对象相互依赖的明显解决方案 Shared.py
是在两个完全不同的位置有两个单独的项目(或者只是拆分文件 Shared.py
并将其重新分发到客户端和服务器),但这仍然不能解决第二个解释器在第一个解释器关闭后终止的问题。
我是否遗漏了某些显而易见的东西?提前感谢您的帮助。
编辑:这是一个最小的可重现示例:
import logging
hostname = 'localhost'
port = 6000
ADDRESS = (hostname, port)
# Log to file
logger = logging.getLogger()
# Set the log level
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler('server.log')
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(handler)
from multiprocessing.connection import Client, Connection
from subprocess import Popen
import time
import sys
from Shared import ADDRESS
# Start process for the Server
process = Popen([sys.executable, 'Server.py'])
time.sleep(0.005)
conn: Connection = Client(ADDRESS)
# Send some data
conn.send('Hello World')
while True:
_in = input('Enter a message: ')
conn.send(_in)
if _in == 'exit':
break
print('Exiting client!')
from multiprocessing.connection import Listener, Connection
from Shared import ADDRESS, logger
import time
listener = Listener(ADDRESS)
conn: Connection = listener.accept()
logger.info('Server started!')
while True:
try:
msg = conn.recv()
logger.info(msg)
except EOFError:
pass
time.sleep(1)
通过 启动程序 python Client.py
;它会要求输入,服务器会将输入记录到文件中。但是,如果您停止客户端(例如使用 Ctrl+C),服务器也会停止运行;您可以通过注释此行来检查这一点: process = Popen([sys.executable, 'Server.py'])
on Client.py
。服务器不应该在单独的进程上运行吗?为什么当客户端的解释器终止时它会停止?