文章目录
前言
本篇文章完成了TCP客户端的程序,程序中用到的系统函数,和自定义函数都进行了注释,如果大家有什么地方不懂可以私信我。
完整程序和服务端介绍在文章结尾有链接,具体功能如下:
Tcp客户端
- 通过IP地址和端口号连接到服务器
- 采用基于行的数据通信协议,与服务器端收发消息
- 在状态显示socket的状态
效果图:
TCP客户器端程序设计
获取本地IPV4地址
QString TcpClient::getLocalIp()
{
//返回主机名
QString hostname = QHostInfo::localHostName();
//返回主机信息
QHostInfo hostInfo = QHostInfo::fromName(hostname);
//返回IP地址列表
QList<QHostAddress> addList = hostInfo.addresses();
QString localIP="";
//判断IP地址列表是否为空
if(!addList.isEmpty())
//遍历IP地址列表,输出主机信息
for(int i=0;i<addList.count();i++)
{
QHostAddress aHost = addList.at(i);
//输出IPV4信息
if(QAbstractSocket::IPv4Protocol==aHost.protocol())
{
localIP= aHost.toString();
break;
}
}
return localIP;
}
鼠标点击槽函数程序
1.连接到服务器
void TcpClient::on_actConnectServer_triggered()
{
QString addr= ui->comboBox->currentText();
quint16 port = ui->spinBox->value();
//connectToHost():以异步的方式连接到指定IP地址和端口的TCP服务器,连接成功发送connect()信号
tcpClient->connectToHost(addr,port);
}
2.断开连接
void TcpClient::on_actDisConnect_triggered()
{
if(tcpClient->state()==QAbstractSocket::ConnectedState)
{
//disconnectFromHost():断开socket,关闭成功后发射disconnected()信号
tcpClient->disconnectFromHost();
}
}
3.清空文本
voidTcpClient::on_actClear_triggered()
{
ui->plainTextEdit->clear();
}
4.发送按钮
void TcpClient::on_btnSend_clicked()
{
QString msg = ui->lineEdit->text();
ui->plainTextEdit->appendPlainText("[out]: "+msg);
ui->lineEdit->clear();
ui->lineEdit->setFocus();
QByteArray str = msg.toUtf8();
str.append('\n');
tcpClient->write(str);
}
其他槽函数程序
1.开始连接槽函数
void TcpClient::onConnected()
{
ui->plainTextEdit->appendPlainText("Client Socket Connected");
ui->btnSend->setEnabled(true);
//peerAddress():在已连接状态下,返回对方socket的地址
ui->plainTextEdit->appendPlainText("Peer Address: "+tcpClient->peerAddress().toString());
//peerPort():在已连接状态下,返回对方socket的端口
ui->plainTextEdit->appendPlainText("Peer Port: "+QString::number(tcpClient->peerPort()));
}
2.断开连接槽函数
void TcpClient::onDisconnected()
{
ui->plainTextEdit->appendPlainText("Client Socket Disconnected");
}
3.实现缓冲区数据的读取槽函数
void TcpClient::onSocketReadyRead()
{
//canReadLine():判断是否有新的一行数据需要读取
while(tcpClient->canReadLine())
{
//readLine():读取一行数据
ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}
}
4.socket状态改变槽函数
void TcpClient::onStateChanged(QAbstractSocket::SocketState socketState)
{
switch(socketState)
{
case QAbstractSocket::UnconnectedState:
LabSocketState->setText("Socket State: UnconnectedState"); break;
case QAbstractSocket::HostLookupState:
LabSocketState->setText("Socket State: HostLookupState"); break;
case QAbstractSocket::ConnectingState:
LabSocketState->setText("Socket State: ConnectingState"); break;
case QAbstractSocket::ConnectedState:
LabSocketState->setText("Socket State: ConnectedState"); break;
case QAbstractSocket::BoundState:
LabSocketState->setText("Socket State: BoundState"); break;
case QAbstractSocket::ClosingState:
LabSocketState->setText("Socket State: ClosingState"); break;
case QAbstractSocket::ListeningState:
LabSocketState->setText("Socket State: ListeningState"); break;
}
}