学习自《Qt5.9 C++开发指南》
服务器端:
QTcpServer *tcpServer; //TCP服务器tcpServer=new QTcpServer(this);
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));当有新的客户端接入时,QTcpServer内部的incomingConnection()函数会创建一个与客户端相连的QTcpSocket对象,然后发射信号newConnection()。
tcpSocket = tcpServer->nextPendingConnection(); //创建socket使用nextPendingConnection()接受客户端的连接,然后使用QTcpSocket与客户端通信。
    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));客户端socket连接建立时发射此信号
void MainWindow::onClientConnected()
{//客户端接入时ui->plainTextEdit->appendPlainText("**client socket connected");ui->plainTextEdit->appendPlainText("**peer address:"+tcpSocket->peerAddress().toString());ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpSocket->peerPort()));
}tcpSocket->peerAddress():对方socket的地址tcpSocket->peerPort():对方socket的端口
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));客户端socket连接断开时发射此信号
void MainWindow::onClientDisconnected()
{//客户端断开连接时ui->plainTextEdit->appendPlainText("**client socket disconnected");tcpSocket->deleteLater();//    deleteLater();//QObject::deleteLater();
}    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));本程序的socket状态变化时发射此信号
void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{//socket状态变化时switch(socketState){case QAbstractSocket::UnconnectedState:LabSocketState->setText("scoket状态:UnconnectedState");break;case QAbstractSocket::HostLookupState:LabSocketState->setText("scoket状态:HostLookupState");break;case QAbstractSocket::ConnectingState:LabSocketState->setText("scoket状态:ConnectingState");break;case QAbstractSocket::ConnectedState:LabSocketState->setText("scoket状态:ConnectedState");break;case QAbstractSocket::BoundState:LabSocketState->setText("scoket状态:BoundState");break;case QAbstractSocket::ClosingState:LabSocketState->setText("scoket状态:ClosingState");break;case QAbstractSocket::ListeningState:LabSocketState->setText("scoket状态:ListeningState");}
}
tcpSocket->state();返回socket当前的状态
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));本程序的socket的读取缓冲区有新数据时发射此信号
void MainWindow::onSocketReadyRead()
{//读取缓冲区行文本
//    QStringList   lines;while(tcpSocket->canReadLine())ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
//        lines.append(clientConnection->readLine());
}
canReadLine():如果有行数据要从socket缓冲区读取,返回true
    QString     IP=ui->comboIP->currentText();//IP地址quint16     port=ui->spinPort->value();//端口QHostAddress    addr(IP);tcpServer->listen(addr,port);//
//    tcpServer->listen(QHostAddress::LocalHost,port);// Equivalent to QHostAddress("127.0.0.1").监听
    if (tcpServer->isListening()) //tcpServer正在监听{tcpServer->close();//停止监听}停止监听
void MainWindow::on_btnSend_clicked()
{//发送一行字符串,以换行符结束QString  msg=ui->editMsg->text();ui->plainTextEdit->appendPlainText("[out] "+msg);QByteArray  str=msg.toUtf8();str.append('\n');//添加一个换行符tcpSocket->write(str);
}tcpSocket向客户端发送信息
客户端:
QTcpSocket  *tcpClient;  //sockettcpClient=new QTcpSocket(this); //创建socket变量    QString     addr=ui->comboServer->currentText();quint16     port=ui->spinPort->value();tcpClient->connectToHost(addr,port);以异步方式连接到指定IP地址和端口的TCP服务器,连接成功后会发射connected()信号
    if (tcpClient->state()==QAbstractSocket::ConnectedState)tcpClient->disconnectFromHost();断开socket,关闭成功后发射disconnected()信号