[英]client server python -C++
我已經使用boost asio和協議緩沖區編寫了簡單的客戶端(C ++)服務器(Python)通信。 我來回傳遞數組。 我將數組從服務器(python)傳遞到客戶端(C ++)時遇到的問題是,我在C ++輸出上的第一個數組只有大約50個元素。 如何解決此問題,我必須傳遞帶有10000個元素的10個數組。
客戶端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上添加一些錯誤處理也很有用,因此如果您不想進行數據包捕獲,則可以檢查實際發送的總字節數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.