基于TCP协议的简单聊天室QT实现

时间:2024-03-26 22:38:20

                            基于TCP协议的简单聊天室QT实现

首先分析:

搭建一个客户端来连通过SOCKET接服务端,经过三次握手连接上服务端后建立稳定的连接链路,然后进行收发数据,相互之间进行通信。

首先需要一个客户端,仿照QQ设计如下:两个按钮一个可以发送输入框的数据至服务端,并且显示在自己的接收栏,另一个按钮可以推出界面。并且实时显示来自服务端的信息,显示在接收界面。

基于TCP协议的简单聊天室QT实现

还需要一个服务端,界面暂定一样,颜色区分:两个按钮一个可以发送输入框的数据至所连接上的客户端,并且显示在自己的接收栏,另一个按钮可以推出界面。并且实时显示来自客户端的信息,显示在接收界面。


基于TCP协议的简单聊天室QT实现

客户端的主要实现:

 构造函数:
     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();
}