首先搞定服务端,这里YTNetWork作为Socket服务端使用,其他的软件也是可以的,点击启动即可
![](https://i-blog.csdnimg.cn/blog_migrate/5423d5559669568a67cff55e12954f29.png)
下面正式进入主题,开发socket 客户端
新建一个Qt的项目 选择QWidget,创建界面如下:
包含了3个控件,2个TextEdit 分别存放 客户端的收的信息 和 发的消息
还有一个button 点击的时候把发送消息发送出去。
在项目管理文件中添加网络支持
QT += core gui network
然后在是widget中的代码:
#include "widget.h"
#include "ui_widget.h"
#include <QtNetwork>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
client = new QTcpSocket(this);
client->connectToHost(QHostAddress("127.0.0.1"), 8080);
connect(client,&QIODevice::readyRead ,[=](){
char* data=new char[1024];
client->readLine(data,1024);
ui->textEdit->setText(QString(data));
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString data=ui->textEdit_2->toPlainText();
QByteArray ba = data.toLocal8Bit(); // 防止中文乱码
client->write(ba);
}
其中创建了一个button点击的槽函数 on_pushButton_clicked() ,这个函数的功能就是发送消息
另外为接收socket处理创建了一个槽函数。
connect(client,&QIODevice::readyRead ,[=](){
char* data=new char[1024];
client->readLine(data,1024);
ui->textEdit->setText(QString(data));
});
一开始比较好奇为什么不直接读取了,搞了一个类似回调函数的感觉,后来一想因为不能阻塞界面啊 , 桌面软件 用户ui必须要响应及时啊。哈哈 是不是有点前端ajax的味道了 。异步的javascript。
ok 一切搞定后启动程序开始测试
输入消息,点击发送 服务端收到了消息
服务端输入消息,点击发送
ok了,总体而言还是比较简单的。