【问题标题】:Sending/Receiving data between two different programs在两个不同的程序之间发送/接收数据
【发布时间】:2013-12-30 12:50:29
【问题描述】:

我主要在这里寻求一些建议。

我正在开发一个应用程序,其中主要处理(存储在服务器上)是在 C++ 中执行的,而 GUI(前端)是在 Python 中执行的。这两个程序将相互通信。 Python 将发送 C++ 程序运行所需的文件,并为 C++ 程序提供一些可使用的数据。然后后端将与处理后的数据进行通信。

因此使用套接字会更好吗?我曾考虑使用文本文件完成此操作,但是,已经放弃了这个想法,而是将数据保存为 .txt 文件,以便在将来的实例中打开它。另外,如果我使用sockets,使用Python/C++会不会有冲突?

任何帮助或建议将不胜感激。

【问题讨论】:

  • 您是在向服务器发送文件,还是通过文件来表示数据?
  • @RaydelMiranda 文件将是 .wav 文件,服务器会将数据作为双精度发送回,但不是作为文件.. 如果这样有意义吗?
  • 但是客户端(Python)发送文件对吗?
  • @RaydelMiranda 是的,抱歉,客户端会将 .wav 文件从其桌面发送到服务器。 =)

标签: c++ python sockets


【解决方案1】:

试试ZeroMQ

ØMQ(也称为 ZeroMQ、0MQ 或 zmq)看起来像一个可嵌入的 网络库,但就像一个并发框架。它给你 跨各种传输传输原子消息的套接字,例如 进程内、进程间、TCP 和多播。您可以连接套接字 N-to-N 模式,如扇出、发布-订阅、任务分配和 请求-回复。它的速度足以成为集群的结构 产品。它的异步 I/O 模型为您提供可扩展的多核 应用程序,构建为异步消息处理任务。它有一个 语言 API 的分数并在大多数操作系统上运行。 ØMQ 来自 iMatix 并且是 LGPLv3 开源。

C++ Hello world 服务器:

//
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <string>
#include <iostream>
#ifndef _WIN32
#include <unistd.h>
#else
#include <windows.h>
#endif

int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        //  Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        //  Do some 'work'
#ifndef _WIN32
        sleep(1);
#else
    Sleep (1);
#endif

        //  Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

Python 客户端:

#
#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555
#   Sends "Hello" to server, expects "World" back
#
import zmq

context = zmq.Context()

#  Socket to talk to server
print "Connecting to hello world server…"
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response
for request in range(10):
    print "Sending request %s …" % request
    socket.send("Hello")

    #  Get the reply.
    message = socket.recv()
    print "Received reply %s [ %s ]" % (request, message)

【讨论】:

    【解决方案2】:

    我会选择命名管道,在您的情况下很容易使用,因为它类似于读取和写入文件,但它也具有类似于套接字的功能,即您可以使它们在网络上通信(不同的主机)

    【讨论】:

      【解决方案3】:

      Would therefore it be better to use Sockets?

      在网络上工作时,您将始终使用套接字。我们可以说套接字是每个网络应用程序的核心。这么说,在回答你的问题时,我认为你的应用程序非常简单(正如你所描述的那样),所以最好不要使用一些第三方模块甚至整个框架来做到这一点。

      查看此答案 Python - Sending files over sockets 这给 c c send and receive file

      希望对你有所帮助。

      【讨论】:

        【解决方案4】:

        Python 是基于 C++ 的,它是一种改进。

        如果您想在一台计算机上的这些应用程序之间发送它,您可以使用文件映射。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx 我认为这是最好的方法。

        但是,如果你想在两台计算机之间发送,一定要使用 TCP Sockets

        【讨论】:

        • Python 是基于 C++ 的?真的吗?
        • 可能是基于 C 的,但它就像它的实现
        • 不,事实并非如此。主要的 Python 实现 CPython 是用 C89 编写的,但它既不存在也不存在。
        猜你喜欢
        • 2021-07-19
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多