void MYthread::run(){ tcpServer->listen(QHostAddress::Any,DEFAULT_PORT);//) connect(tcpServer,SIGNAL(newConnection()),this,SLOT(slot_onNewConnection()));}void MYthread::slot_onNewConnection(){ //[1]+ //QTcpSocket *newClientSocket = tcpServer->nextPendingConnection(); //MYclientThread *newClientThread = new MYclientThread(newClientSocket->socketDescriptor(),this); //[1]- //[2]+ MYclientThread *newClientThread = new MYclientThread(this); newClientThread->setClientSocket(tcpServer->nextPendingConnection()); //[2]- newClientThread->run();}
MYclientThread::MYclientThread(int desc, QObject *parent) //конструктор : QThread(parent), socketDescription(desc){ clientSocket = new QTcpSocket(this); connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_onSocketError(QAbstractSocket::SocketError))); if (!clientSocket->setSocketDescriptor(socketDescription)) { //сюда вообще не заходит, т.е. дескриптор присваевается правильно... QMessageBox msgBox; msgBox.setText("MYclientThread Error setting descriptor"); msgBox.exec(); return; } clientInfo = 0;}void MYclientThread::slot_onDisconnecting(){ //А вот это событие обваливает сокет!!! QMessageBox msgBox; msgBox.setText("MYclientThread Something is wrong! - Disconnecting.."); msgBox.exec(); timer.singleShot(0, clientSocket, SLOT(deleteLater())); //clientSocket->deleteLater(); this->exit(0);}void MYclientThread::run(void){ QMessageBox msgBox; msgBox.setText("MYclientThread running"); msgBox.exec(); // бла-бла... прием, передача, прием...}
C++ (Qt)slot wait_incoming_connection(shared_ptr_to_socket) { new thread(shared_ptr_to_socket)} struct thread { thread(shared_ptr_to_socket s):socket(s) { }protected: void run() { bla bla bla with socket }private: shared_ptr_to_socket socket;};
int MYclientThread::recieveFromClient_string(QString *result){ QDataStream in(clientSocket); in.setVersion(QDataStream::Qt_4_0); quint16 blockSize; if (blockSize == 0) { //вот зачем тут эта проверка??? if (clientSocket->bytesAvailable() < (int)sizeof(quint16)) return 0; in >> blockSize; } if (clientSocket->bytesAvailable() < blockSize) return 0; in >> (*result); return blockSize;}
newClientThread->run();
QDataStream in(clientSocket); in.setVersion(QDataStream::Qt_4_0); quint16 blockSize; if (blockSize == 0) ... {
QDataStream in(clientSocket); in.setVersion(QDataStream::Qt_4_0); quint16 blockSize = 0; //присваиваем ноль if (blockSize == 0) // и тут же проверяем на ноль... зачем? ... {
void Client::requestNewFortune() { getFortuneButton->setEnabled(false); blockSize = 0; socket->abort(); socket->connectToServer(hostLineEdit->text()); } void Client::readFortune() { QDataStream in(socket); in.setVersion(QDataStream::Qt_4_0); if (blockSize == 0) { if (socket->bytesAvailable() < (int)sizeof(quint16)) return; in >> blockSize; } ...
C++ (Qt)class Thread : public QThread{public: // Конструктор отработает в родительском потоке Thread( QTcpSocket *client ) : m_socket( client ) { Q_ASSERT( m_socket ); m_socket->moveToThread( this ); } protected: void run() { // Вот здесь поток создан и мы находимся в нем // Все объекты созданные здесь будут относиться к контектсту этого потока. QTimer timer; // Уже в контексте потока connect( &timer, ... ); connect( m_socket, .... ); exec(); // Запускаем очередь обработки событий } private: QTcpSocket *m_socket;};
connect(this,SIGNAL(readyRead()), this,SLOT(ready_read()));
QPixmap pix=screenShot(); QIODevice * socket = (QIODevice*)this; QDataStream data(socket); data<<QString("send")<<QString::number(6)<<QString("screen")<<pix.size()<<screenShot()<<QString("end");
void connectionTCP::ready_read(){ QByteArray byteArray; QIODevice * socket = (QIODevice*)this; QDataStream data(socket); QString send; int LengthCmd=0; QString cmd; QByteArray dataRaw; QString end("end"); int i=0; while (!data.atEnd()){ data>>byteArray; qDebug()<<"№"<<i++<<"byteArray size"<<byteArray.size()<<"QString"<<QString(byteArray)<<"QString size"<<QString(byteArray).size(); }}