客户端服务器python - c++

client server python -C++

本文关键字:c++ python 服务器 客户端      更新时间:2023-10-16

我使用boost asio和协议缓冲区编写了简单的客户端(c++)服务器(Python)通信。我来回传递数组。我的问题是,当我将数组从服务器(python)传递到客户端(c++)时,我的第一个数组在c++输出中只有大约50个元素。如何解决这个问题,我必须传递10个包含10000个元素的数组。

客户端c++读取客户端数据的代码片段:

            boost::asio::transfer_exactly(65536) */);
    boost::asio::streambuf b;
    boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(10000000);
    size_t n = socket.receive(bufs);
    b.commit(n);
    std::istream is(&b);
    std::string s;
    is >> s;

     object1.ParseFromString(s);
     std::cout << object1.DebugString();
            // this line doesn't output allarray's elemenents. 

}
catch (std::exception& e)
{
    //std::cerr << e.what(luuu) << std::endl;
}
std::cout << "nClosing";
std::string dummy;
    }
Python服务器:

    import socket 
    from test_pb2 import Person
    import dataf_pb2
    host = 'localhost'
    port = 10000
    backlog = 55
    size = 1024 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((host,port))
    s.listen(backlog)
    element = dataf_pb2.ParticleMatrix()
    for i in range(1000):
    element.xPox.append(i * 0.53434)
    for i in range(1000):
    element.yPox.append( i * 0.53434)
    for i in range(1000):
    element.zPox.append(i * 0.53434)
    message= element.SerializeToString()
    element1 = dataf_pb2.ParticleMatrix()
    while 1: 
      client, address = s.accept()
      print ('Client connected')
      data = client.recv(50000)
      print data
      if data:
      object1 = dataf_pb2.ParticleMatrix()
      object1.ParseFromString(data)
      print object1.__str__()
      print object1.ListFields()
      client.send(message)
      client.close()

您是否尝试使用sendall而不是直接发送?我一直在一个类似的客户端/服务器上工作(在纯c++中),我个人认为这是一个缓冲区问题。

我建议的另一件事是尝试捕获环回(如果客户端/服务器在同一台机器上运行),并查看数据包,看看实际发送了什么/多少数据。Wireshark是一个很有用的工具。

在send/recv中添加一些错误处理也会很有用,这样你就可以检查实际发送的总字节数,如果你不想做包捕获