//============server==============
#include "TcpServer.h"
#include <QHBoxLayout>
#include <QNetworkInterface>
#include <QMessageBox>
#include "ChooseInterface.h"
TcpServer::TcpServer(QWidget *parent) :
QWidget(parent)
{
// 创建服务器并监听
_server = new QTcpServer;
_server->listen(QHostAddress::Any, 9988);
//当有客户端来连接时,调用slotNetConnection方法
connect(_server, SIGNAL(newConnection()),
this, SLOT(slotNetConnection()));
_show = new QTextBrowser;
QHBoxLayout* lay = new QHBoxLayout(this);
lay->addWidget(_show);
}
void TcpServer::slotNetConnection()
{
// 判断是否有未处理的连接,相当于C语言中的accept()
while(_server->hasPendingConnections())
{
// 调用nextPeddingConnection去获得连接的socket
_socket = _server->nextPendingConnection();
_show->append("New connection ....");
// 为新的socket提供槽函数,来接收数据
connect(_socket, SIGNAL(readyRead()),
this, SLOT(slotReadyRead()));
}
}
void TcpServer::slotReadyRead()
{
// 接收数据,判断是否有数据,如果有,通过readAll函数获取所有数据
while(_socket->bytesAvailable() > 0)
{
_show->append("Data arrived ..... ");
QByteArray buf = _socket->readAll();
_show->append(buf);
}
}
//==============client==============
#include "TcpClient.h"
#include <QHBoxLayout>
#include <QPushButton>
TcpClient::TcpClient(QWidget *parent) :
QWidget(parent)
{
_socket = new QTcpSocket(this);
_socket->connectToHost("127.0.0.1", 9988);
_lineEdit = new QLineEdit;
QHBoxLayout* lay = new QHBoxLayout(this);
lay->addWidget(_lineEdit);
QPushButton* button = new QPushButton("Send");
lay->addWidget(button);
connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClick()));
connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotButtonClick()));
}
void TcpClient::slotButtonClick()
{
QString strText = _lineEdit->text();
if(strText.isEmpty())
return;
_socket->write(strText.toUtf8());
_lineEdit->clear();
}
//client-example
#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QHostAddress>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
tcpsocket=new QTcpSocket(this);
btn1=new QPushButton(tr("连接"));
btn2=new QPushButton(tr("发送"));
connect(btn1,SIGNAL(clicked()),this,SLOT(btn1_click()));
connect(btn2,SIGNAL(clicked()),this,SLOT(btn2_click()));
edit1=new QLineEdit();
edit2=new QLineEdit();
edit3=new QLineEdit();
label1=new QLabel(tr("IP地址:"));
label2=new QLabel(tr("端口号:"));
label3=new QLabel(tr("消息内容:"));
textb=new QTextBrowser();
QHBoxLayout *lay1=new QHBoxLayout();
lay1->addWidget(label1);
lay1->addWidget(edit1);
lay1->addWidget(label2);
lay1->addWidget(edit2);
lay1->addWidget(btn1);
QHBoxLayout *lay2=new QHBoxLayout();
lay2->addWidget(label3);
lay2->addWidget(edit3);
lay2->addWidget(btn2);
QHBoxLayout *lay4=new QHBoxLayout();
lay4->addWidget(textb);
QVBoxLayout * lay3=new QVBoxLayout(this);
lay3->addLayout(lay1);
lay3->addLayout(lay2);
lay3->addLayout(lay4);
/*接收数据*/
connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(myrecvdata()));
}
bool stat = true;
//连接
void Widget::btn1_click()
{
if(stat == true)
{
/*禁用按钮,值是false*/
//btn1->setEnabled(false);
//获取IP地址
QString ipaddr=edit1->text();
edit1->setEnabled(false);
//获取端口号
QString port=edit2->text();
edit2->setEnabled(false);
serverip=new QHostAddress();
serverip->setAddress(ipaddr);
tcpsocket->connectToHost(*serverip,port.toInt());
connect(tcpsocket, &QTcpSocket::connected, [&](){
QMessageBox::information(this,"Tips","conn success.");
});
btn1->setText(tr("断开"));
stat = false;
}
else
{
//释放socket连接
delete serverip;
serverip = NULL;
edit1->setEnabled(true);
edit2->setEnabled(true);
stat = true;
btn1->setText(tr("连接"));
}
}
//发送
void Widget::btn2_click()
{
QString strtext=edit3->text();
if(!strtext.isEmpty())
tcpsocket->write(strtext.toStdString().data());
/*清空输入框*/
edit3->clear();
/*设置输入框重新获得焦点*/
edit3->setFocus();
}
//接收消息
void Widget::myrecvdata()
{
char buf[1024]={0};
/*bytesAvailable()表示有效数据*/
while(tcpsocket->bytesAvailable()>0)
{
memset(buf,0,sizeof(buf));
tcpsocket->read(buf,sizeof(buf));
textb->append(buf);
//QMessageBox::information(this,"消息",buf);
}
}
//关闭
void Widget::closeEvent(QCloseEvent *event)
{
if(QMessageBox::question(this,"提示","你确定要退出程序吗?",QMessageBox::Yes|QMessageBox::No,QMessageBox::No)==QMessageBox::Yes)
{
event->accept();
}else
{
event->ignore();
}
}
Widget::~Widget()
{
}
备份地址: 【Qt中Tcp:Server、Client】