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
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