8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

从客户端向客户端发送 TCP/fork/socket

Melloware 2月前

56 0

我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c,如果客户端和客户端是通过 fork 创建的并且具有相同的套接字描述符,那么如何从客户端向客户端发送消息。没有...

我正在尝试编写一个聊天程序,协议是 TCP,两个文件是 server.c 和 client.c如果它们是通过 fork 创建的并且具有相同的套接字描述符,则如何从客户端向客户端发送消息。

无论我如何尝试发送消息,它都会出现在发送消息的同一控制台窗口中

帖子版权声明 1、本帖标题:从客户端向客户端发送 TCP/fork/socket
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Melloware在本站《sockets》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我正在开发一个简单的客户端/服务器应用程序,它需要一个入口点(从外部进程调用);为了简单起见,当前的架构有点像这样: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 并将其重新分发到客户端和服务器),但这仍然不能解决第二个解释器在第一个解释器关闭后终止的问题。

    我是否遗漏了某些显而易见的东西?提前感谢您的帮助。

    编辑:这是一个最小的可重现示例:

    共享.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)
    

    客户端.py

    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!')
    

    服务器.py

    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 。服务器不应该在单独的进程上运行吗?为什么当客户端的解释器终止时它会停止?

返回
作者最近主题: