Silver, спасибо за отзыв.
Я в принципе сам не много разобрался с получением данных на сервере, но пока без многопоточной реализации. Решил ее пока не трогать. Теперь появилась другая проблема, я написал небольшой класс для клиента, вызываю его в Main и все работает на ура (скриншот отправляется и принимается на сервере), но стоит в классе, который работает с формой (MainWindow.cpp) загнать тот же код, что и в Main, в обработчик события кнопки, как ни какой отправки не наблюдается, но соединение происходит и сервер его отлавливает (если в дебагер вывести содержимое сокета, то будет по нулям). Еще заметил, что если в Main несколько раз запустить один и тот же кусок кода, то первое соединение работает, а последующие нет (соединение происходит, но ни чего не отправляется). Причем, если через консоль запустить несколько экземпляров программы, то все работает, т.е. сервер не причем
Вот привожу код клиента://///MAIN.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
QPixmap pixmap=QPixmap::grabWindow(QApplication::desktop()->winId());
QDateTime time=QDateTime::currentDateTime();
QString StringTime = time.toString("dd.MM.yyyy hh:mm:ss");
QString address ="127.0.0.1";
int port = 7777;
SendImage s(address, port);
// To send an image give the image and the image name
s.send(pixmap.toImage(), StringTime+".png");
return a.exec();
}
/////////MainWindow.cpp
#include <mainwindow.h>
#include <ui_mainwindow.h>
#include <sendimage.h>
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::doSendImage()
{
QDateTime time=QDateTime::currentDateTime();
QString StringTime = time.toString("dd.MM.yyyy hh:mm:ss");
QPixmap pixmap=QPixmap::grabWindow(QApplication::desktop()->winId());
QString address = ui->hostLineEdit->text();
int port = ui->portLineEdit->text().toInt();
//.............................................
//вызываю экземпляр
SendImage s(address, port);
// To send an image give the image and the image name
s.send(pixmap.toImage(), StringTime+".png");
//.............................................
}
void MainWindow::on_startSendImage_clicked()
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doSendImage()));
timer->start(5000);
}
void MainWindow::on_stopSendImage_clicked()
{
//global timer...
//timer->stop..
}
[b]/////////Как работает класс[/b]
SendImage::SendImage(QString address, int port)
{
this->address = address;
this->port = port;
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()), SLOT(setConnected()));
}
void SendImage::setConnected()
{
reallySend(this->name, this->image);
}
void SendImage::send(QImage image, QString name)
{
// Store the data
this->name = name;
this->image = image;
// Start connection
toggleConnection();
}
void SendImage::reallySend(QString name, /*QPixmap*/QImage image)
{
if(socket->state() == QAbstractSocket::ConnectedState)
{
image.setText("name", name);
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << ba;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
socket->write(block);
qDebug()<<"Size buffer:"<<block.size();
qDebug()<<"Real Size Screen:"<<ba.size();
}
else
{
qDebug("Image has not been send. No connection established!");
}
toggleConnection();
}
void SendImage::toggleConnection()
{
if (socket->state() == QAbstractSocket::UnconnectedState)
{
socket->connectToHost(this->address, this->port, QIODevice::WriteOnly);
}
else
{
socket->disconnectFromHost();
}
}
[b]//////Код класса[/b]
class SendImage : public QObject
{
Q_OBJECT
public:
SendImage(QString address, int port);
void send(QImage image, QString name);
private slots:
void setConnected();
private:
void toggleConnection();
void reallySend(QString name, QImage image);
public:
QString name;
QImage image;
QString address;
int port;
QTcpSocket* socket;
};
Код сервера
///Собственно обработка на сервере, мало ли, может я что-то делаю не так
ImageServer::ImageServer(QObject* parent) : QTcpServer(parent)
{
connect(this, SIGNAL(newConnection()), this, SLOT(addConnection()));
}
void ImageServer::addConnection()
{
qDebug("Adding connection");
QTcpSocket* connection = nextPendingConnection();
//connections in imageserver.h (QList<QTcpSocket>)
connections.append(connection);
connect(connection, SIGNAL(disconnected()), SLOT(removeConnection()));
}
void ImageServer::removeConnection()
{
receiveImage();
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
connections.removeAll(socket);
socket->deleteLater();
}
void ImageServer::receiveImage()
{
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
quint16 blockSize=0;
QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_0);
//qDebug()<<socket->size();
//qDebug()<<socket->bytesAvailable();
if (blockSize == 0)
{
if (socket->bytesAvailable() < (int)sizeof(quint16))
{
return;
}
in >> blockSize;
}
if (socket->bytesAvailable() < blockSize)
{
return;
}
QByteArray Block;
in >> Block;
//qDebug()<<socket->size();
//qDebug()<<socket->bytesAvailable();
qDebug()<<blockSize;
qDebug()<<Block.size();
QImage image;
image.loadFromData(Block,"PNG");
QString filename = image.text("name");
image.save(QString(getenv("HOME"))+"/Screenshot/"+filename,"PNG",100);
}
Что не так, подскажите