QT学习点滴记录(四)
来源:互联网 发布:网络交友新时空ppt 编辑:程序博客网 时间:2024/05/23 17:20
网络TCP(一)
一. 服务器端
1. 新建一个QT Gui Application,工程名为"TCPServer", Base Class 选择QWidget, 并在工程文件TCPServer.pro中添加一句代码:QT += network
2. 在widget.ui设计区添加一个Label, 更改其objectName为statusLabel, 用于显示一些状态信息
3. 修改widget.h文件
添加头文件:#include <QtNetWork>
添加private对象:
QTcpServer* m_TcpServer;
添加私有槽函数:
private slots:
void SendMessage();
4. 修改widget.cpp文件
在构造函数中添加如下代码:
m_TcpServer = new QTcpServer(this);
//监听本地主机的6666端口, 如果出错就输出错误信息, 并关闭
if(!m_pTcpServer->listen(QHostAddress::LocalHost,6666))
{
qDebug()<< m_pTcpServer->errorString();
close();
}
connect(m_pTcpServer,SIGNAL(newConnection()), this,SLOT(SendMessage()));
5.实现槽函数
voidWidget::SendMessage()
{
//用于保存要发送的数据
QByteArray block;
//使用数据流写入
QDataStream out(&block,QIODevice::WriteOnly);
//设置数据流的版本,客户端和服务端使用的版本要相同
out.setVersion(QDataStream::Qt_4_8);
out << (quint16)0;
out << tr("hello TCPClient!!!");
out.device()->seek(0);
out << (quint16)(block.size() -sizeof(quint16));
QTcpSocket* clientConnection =m_pTcpServer->nextPendingConnection();
connect(clientConnection,SIGNAL(disconnected()), clientConnection,SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
ui->statusLabel->setText("SendMessage Successful!!!");
}
6. 编译运行, 结果如下图:
二、客户端
1. 新建Qt Gui Application,工程名为“TCPClient”,Base class选择QWidget, 并在工程文件TCPClient.pro中添加一句代码:QT += network
2. 在widget.ui设计区中添加几个标签Label和两个Line Edit以及一个按钮Push Button, 其中主机名的objectName修改为“HostLineEdit”, 端口号的objectName修改为“PortLineEdit”, 收到的信息的objectName修改为“MessageLabel”
3. 修改widget.h
添加头文件:#include <QtNetWork>
添加私有成员变量:
QTcpSocket*m_pTcpSocket;
QString m_Message; //存放从服务器接收到的字符串
quint16 m_blockSize;//存放文件的大小信息
添加槽函数:
private slots:
void NewConnect();//连接服务器
void ReadMessage();//接收数据
voidDisplayError(QAbstractSocket::SocketError);//显示错误
voidon_pushButton_clicked();
4. 修改widget.cpp
在构造函数中添加如下代码:
m_pTcpSocket = newQTcpSocket(this);
connect(m_pTcpSocket,SIGNAL(readyRead()), this, SLOT(ReadMessage()));
connect(m_pTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(DisplayError(QAbstractSocket::SocketError)));
实现槽函数:
voidWidget::NewConnect()
{
m_blockSize = 0;
//取消已有的连接
m_pTcpSocket->abort();
//连接到主机,这里从界面获取主机地址和端口号
m_pTcpSocket->connectToHost(ui->HostLineEdit->text(),ui->PortLineEdit->text().toInt());
}
voidWidget::ReadMessage()
{
QDataStream in(m_pTcpSocket);
in.setVersion(QDataStream::Qt_4_8);
if(m_blockSize == 0)
{
//判断接收的数据是否有两个字节, 也就是文件的大小信息, 没有则返回, 继续接收数据
if(m_pTcpSocket->bytesAvailable()< (int)sizeof(quint16))
{
return ;
}
//有就保存到m_blockSize中
in >> m_blockSize;
}
//如果没有得到全部的数据,则返回, 继续接收数据
if(m_pTcpSocket->bytesAvailable()< m_blockSize)
{
return ;
}
//将接收到的数据放到m_Message变量中
in >> m_Message;
//显示接收到的数据
ui->Messagelabel->setText(m_Message);
}
voidWidget::DisplayError(QAbstractSocket::SocketError)
{
//输出错误信息
qDebug() <<m_pTcpSocket->errorString();
}
void Widget::on_pushButton_clicked()
{
NewConnect();
}
5. 编译运行, 结果如下图:
6. 先运行服务端, 然后再运行客户端, 其中主机号输入“localhost”, 端口号“6666”, 效果如下图
- QT学习点滴记录(四)
- QT学习点滴记录(五)
- QT学习点滴记录(一)
- QT学习点滴记录(二)
- QT学习记录四
- 学习点滴(四)
- QT开发点滴记录
- 自学QT,点滴记录
- Qt————学习记录(四)
- QT点滴记录,以便查阅
- Qt学习点滴积累
- 学习R点滴记录(基础)
- spring学习笔记(点滴记录)
- 记录学习的点滴(Java基础知识)
- 记录学习的点滴(Js 数组)
- 记录学习的点滴(JQuery 路径)
- ROS学习点滴记录(一)
- 记录学习的点滴(Js跳转)
- codeblocks中设置gcc的链接方式
- Codeforces Round #268 (Div. 2) C 24 Game [构造]
- D层重构一《Sqlhelper》
- thinkphp文件上传与下载
- C++ rand,srand用法
- QT学习点滴记录(四)
- C++ explicit构造函数----禁止隐式格式转换
- js笔记之Math random()、ceil()、floor()、round()
- Explicit——谨慎定义隐式类型转换函数
- UNIX基本命令-目录及文件操作
- [cocos2d] 谁摸了我一下----触摸事件处理
- [cocos2d] 利用texture atlases生成动画
- [cocos2d] 调用动画方法
- Hibernate实体类对象生命周期的3种状态