PDA

View Full Version : ارسال Structure json بزگ با سوکت



returnx
پنج شنبه 22 آبان 1393, 11:44 صبح
می خوام ساختار json بزرگی را با استفاده از سوکت بفرستم و خیلی مهمِ که ساختار json خراب نشه من از کد زیر استفاده می کنم ، اما متاسفانه جواب نمیده و فایل ناقص دریافت میشه:
void send_packet(QByteArray packet)
{
QDataStream data_stream(packet);
//data_stream.setVersion(QDataStream::Qt_5_3);
while (!data_stream.atEnd())
{
int len=1024;
char buffer[len];
int size_read=data_stream.readRawData(buffer,len);
if (size_read==-1)
cout<<"ERROR!";
client_socket->write(buffer,size_read);
client_socket->waitForBytesWritten(-1);
}
}
}
البته فایل های کوچیک مشکلی نداره ، اما از یک اندازه ای که بزرگ تر میشه ، فایل ناقص دریافت میشه...
کد دریافت :
void server::readyRead()
{

QTcpSocket *i_client=(QTcpSocket*) sender();
quint16 packet_size=i_client->bytesAvailable();//Read Count Bytes waiting on line
qDebug()<<"Packet Recived,Packet len: "<<QString::number(packet_size)<<"\n";

if (packet_size>0)
{
QByteArray recive_bytes=i_client->read(packet_size);//Read Packet

//qDebug()<<"PACKET Content:"<<QString(recive_bytes)<<"\n";
m_buffer.append(recive_bytes);
QJsonParseError parse_error;
QJsonDocument doc=QJsonDocument::fromJson(m_buffer.trimmed(),&parse_error);
//QJsonObject packet=QJsonDocument::fromJson(recive_bytes).objec t();
if (parse_error.error==QJsonParseError::NoError)
{
qDebug()<<counter<<":"<<"Parse No Error";
counter++;
QJsonObject packet=doc.object();
if (packet["message_type"].toString()=="HELLO_PACKET")
{
if (packet["app_type"]==client_app)
{

PC_Model *i_pc=new PC_Model(this);
i_pc->mac_address=packet["mac"].toString();
i_pc->ip_address=packet["ip"].toString();
i_pc->pc_name=packet["computer_name"].toString();
client_list.insert(i_client,i_pc);
}
else if (packet["app_type"]==control_panel_app)
{
control_panel_socket=i_client;
advertise_pcs_list();
}
}
else if (packet["message_type"]=="COMMAND_PACKET")
{
if (packet["reciver"]!="server")
{
QString reciver=packet["reciver"].toString();
PC_Model *target_pc;
foreach (PC_Model *item,client_list.values())
{
if (item->mac_address==reciver)
{
target_pc=item;
break;
}
}

QTcpSocket *temp=client_list.key(target_pc);
send_packet_to_client_app(temp,m_buffer);
}
}
else if (packet["message_type"]=="ANSWER_PACKET")
{
if (packet["reciver"]=="control_panel")
{
send_packet_to_control_panel(m_buffer);
}
}
m_buffer.clear();
}
else if (parse_error.error!=QJsonParseError::NoError)
{
qDebug()<<counter<<":"<<"Parse IS Error";
std::cout<<"("<<parse_error.errorString().toStdString()<<")"<<"\n";
counter++;
QFile i_file("D:\\is_error.txt");
i_file.open(QIODevice::WriteOnly);
{
i_file.write(m_buffer);
i_file.waitForBytesWritten(10000);
}
i_file.close();
}

}


}//End function

returnx
جمعه 23 آبان 1393, 13:47 عصر
مشکل حل شد ، سایز بافر را کوچیک کردم یعنی از 1024 به 256 مشکل بر طرف شد...

behnia_k
یک شنبه 25 آبان 1393, 22:41 عصر
دلیلش چی میتونه باشه

حامد مصافی
دوشنبه 26 آبان 1393, 19:12 عصر
نمونه‌ای از اون فایل ناقص رو دارید؟ اگر جواب مثبت هست و براتون مقدور هست ممنون میشم اینجا قرار بدیدش. یا اینکه بفرمایید فایل چطوری ناقص می‌شد؟ به هم میریخت؟ قسمت‌هایی از اون ناپدید میشد یا اینکه آخر فایل نمیرسید.

returnx
سه شنبه 27 آبان 1393, 09:06 صبح
نمونه‌ای از اون فایل ناقص رو دارید؟ اگر جواب مثبت هست و براتون مقدور هست ممنون میشم اینجا قرار بدیدش. یا اینکه بفرمایید فایل چطوری ناقص می‌شد؟ به هم میریخت؟ قسمت‌هایی از اون ناپدید میشد یا اینکه آخر فایل نمیرسید.
در واقع یک فایلی که می بایست مثلا چند مگابایت می بود تقریبا 53KB دریافت میشد و نکته ی جالب این بود که عدد 53 برای یک فایل با یک حجم خاص ثابت بود، یعنی سمت سرور همیشه 53 KB دریافت میشد...
متاسفانه نمونه ی این فایل را ندارم ، ولی شما اینطور تصور کنید که یک ساختار JSON با چندین KEY که یکیش ، یک آرایه ی بود مقادیر Binary یک فایل در این آرایه دخیره شده...
و نکته ی جالب اینکه برای فایل های بزرگ بافر 256 بایتی هم بزرگ و من مجبور شدم یک بایت یک بایت فایل را ارسال کنم...
به نظر شما فرستادن سریع باعث این توقف میشه !؟ اگه با یک تاخیر 100 میلی ثانیه ای ارسال هر تیکه همراه باشه ، ممکنه که این مشکل حل شه!؟

ciph3r
پنج شنبه 29 آبان 1393, 21:18 عصر
1 سوال که شاید خارج بحث باشه و ببخشید
این json در کیوت چطوری میشه کار کرد و چه نقشی رو داره و برای چه کاری ازش استفاده میشه ؟
دنبال یه چیزی هستم احساس می کنم این باشه
ممنون میشم توضیحاتی رو در خصوص مطلب بنویسید
با تشکر

returnx
پنج شنبه 29 آبان 1393, 22:19 عصر
Json روشی برای ذخیره سازی داده هست ، مثل XML و ساختار Key-Value داره...
برای ذخیره سازی داده و ارسال بسیار ساختار خوبیست ، داده ها به راحتی استخراج میشن...
برای مثال می خواهید اطلاعات چند دانش آموز را به صورت json ذخیره کنید ، که میشه به این طور عمل کرد :
{
"student":[
{"name":"Ali","family":"ahmadi","ID":5555}
{"name":"reza","family":"rezaie","ID":3333}
]

}
برای خواندن و نوشتن ساختار Json در کیوت میتونید از کلاس های QjsonObject,QjsonDocument,Qjsonvalueو... استفاده کنید که کار را بسیار ساده می کنه...