#ifndef SERVERCLIENT_H#define SERVERCLIENT_H#include <QtGui>class QTcpServer;class QTcpSocket;class Widget :public QWidget{ Q_OBJECT public: QPushButton* connection; QPushButton* opendir; QPushButton* send; QLabel* label_port; QLabel* label_answer; QLineEdit* IP; QLineEdit* Port; QLineEdit* letter; QTcpServer* TcpServer; QTcpSocket* TcpSocket; quint16 blockSize; Widget(); public slots: void connection_clicked(); void send_clicked(); void opendir_clicked(); virtual void slotNewConnection(); void slotReadAnswer(); void sendAnswerToClient(QString& str); protected: void send_letter_to_client();};#endif // SERVERCLIENT_H
#include "server-client.h"#include <QDebug>#include <QFileDialog>#include <QtNetwork>Widget::Widget(){ // кнопка соединения connection = new QPushButton(QString("connection"),this); QObject::connect(connection,SIGNAL(clicked()),SLOT(connection_clicked())); // кнопка отпраки данных send = new QPushButton(QString("send"),this); QObject::connect(send,SIGNAL(clicked()),SLOT(send_clicked())); // кнопка выбора файла opendir = new QPushButton(QString("open dir"),this); QObject::connect(opendir,SIGNAL(clicked()),SLOT(opendir_clicked())); // Label port label_port = new QLabel(this); label_port->setText("Current Port"); // Label answer label_answer = new QLabel(this); label_answer->setText(QString::fromLocal8Bit("Ждём ответа...")); // IP IP = new QLineEdit(this); IP->setText("IP"); // Port Port = new QLineEdit(this); Port->setText("Port"); // Letter letter = new QLineEdit(this); letter->setText("Enter message"); // размещение виджетов QGridLayout *Layout = new QGridLayout; Layout->addWidget(IP,0,0); Layout->addWidget(Port,1,0); Layout->addWidget(letter,2,0); Layout->addWidget(label_port,3,0); Layout->addWidget(label_answer,4,0); Layout->addWidget(connection,0,1); Layout->addWidget(send,1,1); Layout->addWidget(opendir,2,1); setLayout(Layout);}void Widget::connection_clicked(){ //настраиваем сервер на слушание каналов TcpServer = new QTcpServer(this); if (!TcpServer->listen(QHostAddress::Any,1115)) { QMessageBox::critical(this, tr("Server"), tr("Unable to start the server: %1.") .arg(TcpServer->errorString())); close(); return; } label_port->setText(tr("port %1.\n").arg(TcpServer->serverPort())); // Выводим порт сервера, если сервер прослушивает соединения, в противном случае выведется 0. QObject::connect(TcpServer,SIGNAL(newConnection()),SLOT(slotNewConnection())); // устанавливаем соединение с новым клиентом,который подключился}void Widget::send_clicked(){ TcpSocket = new QTcpSocket(this); blockSize = 0; TcpSocket->connectToHost(IP->text(),1115); send_letter_to_client(); QObject::connect(TcpSocket, SIGNAL(readyRead()), this, SLOT(slotReadAnswer())); // читаем ответ сервера // посылаем клиенту сообщение}void Widget::opendir_clicked(){ QFileDialog d; QString dir_name = d.getExistingDirectory();}void Widget::slotNewConnection(){ // создание нового соединения с очередным клиентом QString answer="Connected!!!"; TcpSocket = TcpServer->nextPendingConnection(); QObject::connect(TcpSocket,SIGNAL(disconnected()),TcpSocket,SLOT(deleteLater())); // читаем сообщение клиента,если он что-то нам сообщает QObject::connect(TcpSocket, SIGNAL(readyRead()),this,SLOT(slotReadAnswer())); sendAnswerToClient(answer); // отсылаем ответ клиенту}void Widget::sendAnswerToClient(QString &str){ // отсылаем сообщение очередному клиенту об успешном соединении QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_0); out << (quint16)0; out << str; out.device()->seek(0); out << (quint16)(block.size() - sizeof(quint16)); TcpSocket->write(block);}void Widget::slotReadAnswer(){ TcpSocket = (QTcpSocket*)sender(); QString str; QDataStream in(TcpSocket); in.setVersion(QDataStream::Qt_4_5); for (;;) { if (!blockSize) { if (TcpSocket->bytesAvailable() < sizeof(quint16)) { break; } in >> blockSize; } if (TcpSocket->bytesAvailable() < blockSize) { break; } in >> str; blockSize = 0; } label_answer->setText(str);}void Widget::send_letter_to_client(){ TcpSocket = new QTcpSocket(this); QString str; str = letter->text(); QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_0); out << (quint16)0; out << str; out.device()->seek(0); out << (quint16)(block.size() - sizeof(quint16)); TcpSocket->write(block);}