服务端:
1.创建用于监听套接字
2.设置套接字为监听
3.当有新的客户端要连接时,该套接字会发出newConnection()的信号,
4.接着要建立连接时调用nextPendingConnect()返回一个QTcpSocket对象用于通信
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
#include<QDebug>
#include<QHostAddress>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QTcpServer *my_sever;
QList<QTcpSocket* > my_client;
int len;
private slots:
void newConnectionSlots();//新用户连接
void disConnectSlots();//客户端断开
void readyReadSlots();
//客户端读取消息
void on_pushButton_listen_clicked();
void on_pushButton_send_clicked();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDataStream>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("服务端");
len=0;
ui->lcdNumber_sockeNum->display(len);
my_sever=new QTcpServer();
connect(my_sever,&QTcpServer::newConnection,this,&Widget::newConnectionSlots);
}
Widget::~Widget()
{
delete ui;
}
void Widget::newConnectionSlots()
{
QTcpSocket *sock=my_sever->nextPendingConnection();
my_client.append(sock);
len++;
ui->lcdNumber_sockeNum->display(len);
QString info;
info+="ip="+sock->peerAddress().toString()+" 端口="+QString::number(sock->peerPort());
ui->textBrowser_clientInfo->append(info);
connect(sock,&QTcpSocket::readyRead,this,&Widget::readyReadSlots);
}
void Widget::disConnectSlots()
{
}
void Widget::readyReadSlots()
{
QTcpSocket *sock=qobject_cast<QTcpSocket*>(sender());
if(sock!=NULL)
{
if(sock->isReadable())
{
int len=sock->bytesAvailable();
QByteArray arr=sock->read(len>65536?65536:len);
QString str=QString::fromLocal8Bit(arr);
qDebug()<<str<<endl;
ui->textBrowser_recv->append(str);
}
}
}
void Widget::on_pushButton_listen_clicked()
{
QString ip=ui->lineEdit_address->text();
qint16 port=ui->lineEdit_port->text().toInt();
QHostAddress address=QHostAddress(ip);
qDebug()<<ip<<" "<<port<<endl;
if(!my_sever->isListening())
{
if(!my_sever->listen(address,port))
{
qDebug()<<my_sever->errorString();
return ;
}
else
{
ui->pushButton_listen->setText("停止监听");
}
}
else
{
my_sever->close();
ui->pushButton_listen->setText("开始监听");
}
}
void Widget::on_pushButton_send_clicked()
{
QString str=ui->plainTextEdit_sendInfo->toPlainText();
if(str=="")
{
QMessageBox::warning(this,"警告","发送内容不能为空");
return ;
}
QString res;
res+="服务端: "+str;
QByteArray arr=res.toUtf8();
ui->plainTextEdit_sendInfo->clear();
ui->plainTextEdit_sendInfo->setFocus();
for(int i=0;i<my_client.size();i++)
{
my_client[i]->write(arr);
}
ui->textBrowser_recv->append(res);
}
客户端:
1.创建套接字
2.连接服务器 connectToHost();
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void readyReadSlots();
void on_pushButton_send_clicked();
void on_pushButton_listen_clicked();
private:
Ui::Widget *ui;
QTcpSocket *my_socket;
bool connectstat;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QHostAddress>
#include<QDebug>
#include<QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("客户端");
my_socket=new QTcpSocket();
connectstat=false;
connect(my_socket,&QTcpSocket::readyRead,this,&Widget::readyReadSlots);
}
Widget::~Widget()
{
delete ui;
}
void Widget::readyReadSlots()
{
int len=my_socket->bytesAvailable();
QByteArray arr=my_socket->read(len>65536?65536:len);
QString str=QString::fromUtf8(arr);
ui->textBrowser_recv->append(str);
}
void Widget::on_pushButton_send_clicked()
{
QString str=ui->plainTextEdit_sendInfo->toPlainText();
if(str=="")
{
QMessageBox::warning(this,"警告","发送的内容不能为空");
return ;
}
ui->plainTextEdit_sendInfo->clear();
ui->plainTextEdit_sendInfo->setFocus();
QString res;
res+="ip="+my_socket->peerAddress().toString()+" 端口="+QString::number(my_socket->peerPort())+": "+str;
QByteArray arr=res.toLocal8Bit();
my_socket->write(arr);
ui->textBrowser_recv->append(res);
}
void Widget::on_pushButton_listen_clicked()
{
QString ip=ui->lineEdit_address->text();
qint16 port=ui->lineEdit_port->text().toInt();
QHostAddress address=QHostAddress(ip);
if(!connectstat)//如果没有连接
{
my_socket->connectToHost(address,port);
if(!my_socket->waitForConnected(5000))
{
qDebug()<<my_socket->errorString();
return ;
}
else
{
ui->pushButton_listen->setText("断开连接");
connectstat=true;
}
}
else
{
ui->pushButton_listen->setText("开始监听");
connectstat=false;
}
}
成果: