#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
TcpServer = new QTcpServer(this);
clientSocket = new QTcpSocket(this);
serverSocket= new QTcpSocket(this);
desktop = QApplication::desktop();
//提示信息
ui->ipAddr->setPlaceholderText("Please enter an IP address :");
screenShare.setWindowTitle("server");
acceptScreen.setWindowTitle("client");
//当点击file后点击create server时程序为服务端模式
connect(ui->new_Connection, &QAction::triggered,
this, &MainWindow::setTcpServer);
//当输入ip后,程序为客户端模式
connect(ui->signIp, &QPushButton::clicked, this, &MainWindow::setTcpClient);
}
MainWindow::~MainWindow()
{
delete ui;
}
//定时器,实现服务端发送屏幕主功能
void MainWindow::timeTimer()
{
//调用screenshow的函数
screenShare.startShow();
screenShare.closeShow();
//当点击开始分享按钮时,执行以下if,服务端发送数据
if(flag == true)
{
ba = setDatagram(ba);//设置数据报
for(int i = 0; i < allSocket.size(); i++)
{
allSocket[i]->write(ba);
}
ba.clear();
}
//当关闭客户端窗口时,断开tcp连接
if(connectFlag == false)
serverSocket->disconnectFromHost();
}
//当点击new Connection时,调用此函数,设置为服务端模式
void MainWindow::setTcpServer()
{
qDebug() << "设置服务端连接成功";
//设置为服务端模式
tcpServerSetting(TcpServer);
connect(TcpServer, &QTcpServer::newConnection,
this, &MainWindow::connectToClient);//新连接接入信号槽
//this->hide();
screenShare.show();
timer = Timerstrat(200);
connect(timer, &QTimer::timeout, this, &MainWindow::timeTimer);
}
//当点击sign in时,调用此函数,设置为客户端模式
void MainWindow::setTcpClient()
{
//设置为客户端模式
tcpClientSetting(clientSocket,ui->ipAddr->text());
if(clientSocket->state() == QAbstractSocket::UnconnectedState)
{
qDebug() << "error";
}
qDebug() << "设置客户端连接成功";
acceptScreen.show();
//若套接字连接上,则触发connectedToServer函数
connect(clientSocket, &QTcpSocket::connected, this, &MainWindow::connectedToServer);
}
//当服务端连接上客户端时,调用此函数
void MainWindow::connectToClient()
{
//取出建立好连接的套接字
QObject *object = QObject::sender();//获取信号发送者
QTcpServer *server = qobject_cast<QTcpServer *>(object);//将object对象转换为QTcpServer对象/
serverSocket = server->nextPendingConnection();//建立新的套接字
allSocket.append(serverSocket);
qDebug()<< allSocket;
screenShare.showNum(QString("%1").arg(allSocket.size()));
//获取对方的IP和端口
QString ip = serverSocket->peerAddress().toString();
qint16 port = serverSocket->peerPort();
screenShare.showClientList(QString("[%1:%2]").arg(ip).arg(port));
qDebug() << "连接客户端成功";
}
//当客户端连接上服务端时,调用此函数
void MainWindow::connectedToServer()
{
qDebug() << "连接服务器成功";
//若套接字接收到,则触发readsocket函数
connect(clientSocket, &QIODevice::readyRead, this, &MainWindow::readSocket);
}
//当客户端连接上服务端且接收到服务端信息时,调用此函数
void MainWindow::readSocket()
{
QPixmap map;
QByteArray headdata;
headdata[0]='#';
headdata[1]='#';
headdata[2]='@';
headdata[3]='$';
headdata[4]=':';
headdata[5]=':';
QByteArray lastdata;
lastdata[0]=':';
lastdata[1]=':';
lastdata[2]='*';
lastdata[3]='*';
lastdata[4]='$';
lastdata[5]='#';
myData.append(clientSocket->readAll());
int lastindex=myData.indexOf(lastdata,0);//寻找包尾位置
if(lastindex!=-1){
int headindex=myData.indexOf(headdata,0);//寻找包头位置
myData.remove(0,headindex);//移除多余内容
if(headindex!=-1){
realData = myData.mid(6,myData.size()-12);//取出真实数据
map.loadFromData(realData);
acceptScreen.clientShow(map);
myData.remove(0,realData.size()+12);
}
}
}
//获取屏幕截图
QPixmap MainWindow::getScreen(QPixmap pixmap)
{
QScreen *screen = QGuiApplication::primaryScreen();
pixmap = screen->grabWindow(desktop->winId(), 0, 0, -1, -1);
//快速缩放(FastTransformation)、平滑缩放(SmoothTransformation)
pixmap = pixmap.scaled(desktop->width()*0.8, desktop->height()*0.8, Qt::KeepAspectRatio, Qt::FastTransformation)
.scaled(desktop->width()*0.6, desktop->height()*0.6, Qt::KeepAspectRatio, Qt::SmoothTransformation);
return pixmap;
}
//设置数据报函数,设置数据报首尾
QByteArray MainWindow::setDatagram(QByteArray data)
{
newpixmap = getScreen(newpixmap);
screenShare.serverShow(newpixmap);
//图片变化时则发送,否则不发送
if(oldpixmap.toImage()!=newpixmap.toImage())
{
QByteArray ByteArray;
image=newpixmap.toImage();
QBuffer buffer(&ByteArray);
ByteArray.resize(0);
buffer.open(QIODevice::ReadWrite);
image.save(&buffer ,"jpg");
char t_header[7] = "##@$::";
char t_tail[7] = "::**$#";
data.append(t_header);
data.append(ByteArray);
data.append(t_tail);
}
return data;
}
- 1
- 2
- 3
前往页