基于TCP协议的简单聊天室QT实现
首先分析:
搭建一个客户端来连通过SOCKET接服务端,经过三次握手连接上服务端后建立稳定的连接链路,然后进行收发数据,相互之间进行通信。
首先需要一个客户端,仿照QQ设计如下:两个按钮一个可以发送输入框的数据至服务端,并且显示在自己的接收栏,另一个按钮可以推出界面。并且实时显示来自服务端的信息,显示在接收界面。
还需要一个服务端,界面暂定一样,颜色区分:两个按钮一个可以发送输入框的数据至所连接上的客户端,并且显示在自己的接收栏,另一个按钮可以推出界面。并且实时显示来自客户端的信息,显示在接收界面。
客户端的主要实现:
构造函数:
ui->setupUi(this);
_socket= new QTcpSocket;//_socket指向一个实例化的QTcpSocket结构体指针
_socket->connectToHost("127.0.0.1",8888);//要连接的IP地址于端口号
connect(_socket,SIGNAL(readyRead()),this,SLOT(recv_info()));//监听数据
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_2_clicked));//监听按键状态
void Widget::beijing()//改变textBrowserd的背景颜色
{
QPalette pal;
pal = ui->textBrowser->palette();
pal.setColor(QPalette::Base, QColor(0,253,0));//改变背景色
ui->textBrowser->setPalette(pal);
}
void Widget::on_pushButton_clicked()//按键关闭界面
{
this->close();
}
void Widget::on_pushButton_2_clicked()//按下发送按钮
{
QString str1;
if(ui->textEdit->toPlainText()!="")//如果文本框没东西就不发送
{
str1=ui->textEdit->toPlainText();//显示在自己的界面上
ui->textBrowser->append("自己:");
ui->textBrowser->append(" "+str1);
QByteArray buff=str1.toUtf8();//转换格式
_socket->write(buff);//通过套接字发送
ui->textEdit->clear();//清除输入区
}
}
void Widget::recv_info()
{
QString buf=_socket->readAll();//通过套接字接收数据
ui->textBrowser->append("儿子:");//显示数据
ui->textBrowser->append(" "+buf);
}
服务端的主要实现:
构造函数:
ui->setupUi(this);
_server= new QTcpServer(this); //申请一个QTcpServer结构体空间
_socket=NULL;
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_2_clicked));//监听按键
connect(_server,SIGNAL(newConnection()),this,SLOT(acceptconnect()));//监听连接信号
start();//监听端口
void Widget::start()//监听端口
{
if(!_server->listen(QHostAddress::Any,8888))//监听端口号码8888,如果有连接就接入。
{
close();
return ;
}
}
void Widget::on_pushButton_2_clicked()//按键按下的情况
{
QString str2;
if(ui->textEdit->toPlainText()!="")//如果文本框没东西就不发送
{
str2=ui->textEdit->toPlainText();//显示在自己的界面上
ui->textBrowser->append("自己:");
ui->textBrowser->append(" "+str2);
QByteArray buff1=str2.toUtf8();//转换格式
_socket->write(buff1);//通过套接字发送
ui->textEdit->clear(); //清除输入区
}
}
void Widget::acceptconnect()
{
_socket=_server->nextPendingConnection();
connect(_socket,SIGNAL(readyRead()),this,SLOT(readdata()));//监听数据
}
void Widget::readdata()//如果有数据就来执行
{
QString fromc=_socket->readAll();//通过套接字接收数据
ui->textBrowser->append("儿子:");//显示数据
ui->textBrowser->append(" "+fromc);
}
void Widget::on_pushButton_clicked()//点击按钮关闭窗口
{
this->close();
}