QtTCP大型实验源代码

合集下载

qt实例100例代码

qt实例100例代码

qt实例100例代码摘要:1.项目背景及意义2.QT简介3.实例100例代码概述4.实例分类与代码解析5.总结与拓展正文:一、项目背景及意义随着科技的不断发展,嵌入式系统在各行各业中的应用越来越广泛。

作为一种跨平台的C++图形用户界面应用程序开发框架,Qt在嵌入式领域具有很高的地位。

本文旨在为广大开发者提供一个实用的Qt实例教程,帮助大家更好地掌握Qt编程技巧,为嵌入式项目开发提供支持。

二、QT简介Qt是一款由挪威公司Trolltech创立的跨平台C++图形用户界面(GUI)应用程序开发框架。

Qt具有以下特点:1.基于C++:Qt使用C++作为编程语言,具有良好的性能和可移植性。

2.跨平台:Qt支持多种操作系统,如Windows、Linux、macOS等。

3.强大的组件库:Qt提供了丰富的图形界面组件,方便开发者快速搭建应用程序。

4.良好的集成开发环境(IDE):Qt提供了一套完整的开发工具,包括QtCreator、Qt Designer等。

5.面向对象:Qt遵循面向对象编程(OOP)原则,有助于提高代码的可维护性和可重用性。

三、实例100例代码概述本文将介绍Qt实例100例代码,这些实例涵盖了Qt的各个方面,包括基本组件、布局管理、网络通信、数据库操作、多媒体、绘图等。

通过学习这些实例,读者可以逐步掌握Qt的应用技巧,为自己的项目打下坚实基础。

四、实例分类与代码解析1.基本组件:包括QWidget、QLabel、QPushButton、QVBoxLayout 等基本组件的使用。

2.布局管理:介绍Qt的布局管理器,如QBoxLayout、QGridLayout、QFormLayout等。

3.网络通信:涉及TCP/IP、UDP协议的使用,以及QTcpServer、QTcpClient等类的作用。

4.数据库操作:介绍如何使用Qt进行数据库查询、插入、更新和删除等操作。

5.多媒体:包括音频、视频播放,以及图像处理等。

qtcpsocket案例

qtcpsocket案例

qtcpsocket案例QTcpSocket是Qt框架提供的用于进行TCP通信的类。

它提供了一系列的接口函数,可以实现TCP客户端和服务器端的功能。

下面是一个使用QTcpSocket的案例。

假设我们有一个简单的网络聊天室系统,实现客户端之间的聊天功能。

首先我们需要创建一个客户端,连接到服务器。

客户端发送消息给服务器,当服务器接收到消息后,将消息广播给所有连接到服务器的客户端。

首先创建一个Qt的控制台应用程序,包括头文件`QTcpSocket`。

在主函数中创建一个客户端类`ChatClient`,并调用其成员函数`start`启动客户端。

```cpp#include <QCoreApplication>#include <QTcpSocket>class ChatClient : public QObjectQ_OBJECTpublic:ChatClientsocket = new QTcpSocket(this);connect(socket, &QTcpSocket::connected, this,&ChatClient::onConnected);connect(socket, &QTcpSocket::readyRead, this,&ChatClient::onReadyRead);}void startsocket->connectToHost("localhost", 1234);qDebug( << "Connecting to server...";}private slots:void onConnectedqDebug( << "Connected to server";socket->write("Hello server");}void onReadyReadQString message = QString::fromUtf8(socket->readAll();qDebug( << "Received message:" << message;}private:QTcpSocket* socket;};int main(int argc, char *argv[])QCoreApplication a(argc, argv);ChatClient client;client.start(;return a.exec(;```上面的代码中,我们首先在构造函数中创建了一个`QTcpSocket`对象,并连接了`connected`和`readyRead`信号,分别与`onConnected`和`onReadyRead`槽函数绑定。

qt qtcpsocket 用法

qt qtcpsocket 用法

qt qtcpsocket 用法QT是一种跨平台开发工具,支持多种编程语言,例如C++、Java 等,QT拥有强制性的C++ API,允许开发者完成各种应用程序的UI设计、数据库操作、网络编程等功能。

QT中的QTcpSocket是一个可以用于网络通信的类,它提供了一个TCP套接字便捷的封装,允许开发者以同步或异步方式将数据从客户端发送到服务器。

下面,我们来一步步阐述QT的QTcpSocket的用法。

第一步:使用QTcpSocket建立连接我们可以使用下面的代码来使用QTcpSocket建立连接:```cppQTcpSocket socket;socket.connectToHost(hostName, portNumber);if(socket.waitForConnected())qDebug() << "Connected to host " << hostName << " on port " << portNumber;elseqDebug() << "Connection failed.";```其中,hostName和portNumber分别是我们需要连接的主机名和端口号。

可以通过waitForConnected函数来等待连接成功。

连接成功后,调试器将输出Connected to host xxx on port yyy。

第二步:发送数据成功建立连接后,我们可以使用QTcpSocket发送数据,以发送字符串为例:```cppQString message = "Hello, world!";socket.write(message.toUtf8());```这里,我们首先将要发送的字符串转换为UTF-8编码格式,并调用QTcpSocket的write函数发送数据。

QT_TCP下的socket编程

QT_TCP下的socket编程

QT TCP下的socket编程转载:/blog/static/1755423992011215641 781/qt_转载 2011-03-01 17:06:41 阅读8 评论0 字号:大中小订阅QTcpSocket 和 QTcpServer类实现了Qt的Tcp客户端和服务器。

tcp是一个流式协议。

对于应用程序来说,数据是一个很长的流,有点像一个巨大的文件。

搞成此的协议建立在面向块的tcp协议(Block-oriented)或面向行(Line-oriented )的tcp协议上。

面向块的tcp协议,数据被当作一个2进制的块来传输。

没每一个块被当作一个定义了大小的,后面跟随了数据的字段。

面向行的tcp协议,数据被当作一个文本文件的一行。

一个传输终止于一个新的行的到来。

QTcpSocket 继承自 QIODevice,所以它可以从 QDataStream 或 QTextStream 中读取或写入数据。

从文件读数据和从网络上读数据有一个明显的不同点:我们必须保证用“>> ”操作符读取数据时,已经从另一方接收了足够的数据。

如果你这样做了,那么一个失败的结果是:行为未定义。

我们来看一个使用block-oriented tcp协议的服务器和客户端的代码。

用户填写行程的起始地,目的地,日期等,服务器返回符合要求的行程。

界面用QDesigner设计的。

叫做“tripplanner.ui”。

请使用uic工具转换。

include "ui_tripplanner.h"class TripPlanner : public QDialog, public Ui::TripPlanner{Q_OBJECTpublic:TripPlanner(QWidget *parent = 0);private slots:void connectToServer();void sendRequest();void updateTableWidget();void stopSearch();void connectionClosedByServer();void error();private:void closeConnection();QTcpSocket tcpSocket; //tcpSocket变量是QTcpSocket 类型,用来建立一个tcp连接。

QT中TCP通信及遇到的问题

QT中TCP通信及遇到的问题

QT中TCP通信及遇到的问题以⾃定数据包格式进⾏通信数据包格式如下:服务端代码如下:。

cpp⽂件:主界⾯程序会发送emit sendTime()和emit sendOCRMsg(OCRMsg, dateTime)信号对应HeratPack和sendData槽函数#include "TCPthread.h"#include <qdebug.h>#include <qtimer.h>#include <qthread.h>#include <qdatastream.h>TCPthread::TCPthread(QObject *parent){qDebug() << "TCPthread线程id:" << QThread::currentThread();tcpServer = NULL;//监听套接字,指定⽗对象,让其⾃动回收空间tcpServer = new QTcpServer(this);tcpServer->listen(QHostAddress::AnyIPv4, 8888);//当有客服端连接时connect(tcpServer, &QTcpServer::newConnection,this,&TCPthread::createSocket);//-----------------------------------------------------------------------------------------------}void TCPthread::createSocket() {//取出建⽴好连接的套接字QTcpSocket *tcpSocket = tcpServer->nextPendingConnection();socketList.push_back(tcpSocket);//获取客户端的IP和端⼝QString ip = tcpSocket->peerAddress().toString();qint16 port = tcpSocket->peerPort();IPort = QString("TCPClient-[%1:%2]:成功连接").arg(ip).arg(port);qDebug() << IPort;connect(tcpSocket, &QTcpSocket::connected,[=]() {qDebug() << "成功和服务器建⽴好连接";});//接受客服端的数据connect(tcpSocket, &QTcpSocket::readyRead,this, &TCPthread::readData);//当客户端断开连接connect(tcpSocket, &QTcpSocket::disconnected, this, &TCPthread::clientDiscon);}//从客户端读取数据void TCPthread::readData() {//从通信套接字中取出内容if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){QByteArray array = socketList[i]->readAll();}}}//客户端断开连接void TCPthread::clientDiscon() {//与服务器连接的客户端QTcpSocket *tcpsocket = qobject_cast<QTcpSocket*>(QObject::sender());//移除socketList.removeOne(tcpsocket);qDebug() << "Client-IP:" << tcpsocket->peerAddress().toString() << "断开连接";tcpsocket->deleteLater();}//TCP服务器发送板坯报⽂数据槽函数void TCPthread::sendData(QString OCR_Msg, QDateTime dateTime) {//封装包头QByteArray sendOCRByte;//⽤于发送数据的字节数组QDataStream out(&sendOCRByte, QIODevice::WriteOnly);//使⽤数据流写⼊数据out.setByteOrder(QDataStream::LittleEndian);//设置⼩端模式out << ushort(0) << m_OCRPackID;//占位符,这⾥必须要先这样占位,然后后续读算出整体长度后在插⼊qDebug() << "报⽂头长度:" << sendOCRByte.length();//4//封装数据QString s_data = OCR_Msg + dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz") +"0";qDebug() << s_data << "字符串长度:" << s_data.length();//48QByteArray ba = s_data.toLocal8Bit(); //字符串转字节数组qDebug() << "字符字节数组长度:" << ba.length(); //48//---------------------------------------------------------char * c_data;c_data = ba.data();sendOCRByte.append(c_data);//在4个字节数组中添加48个字符串//---------------------------------------------------------out.device()->seek(0);//回到数据流开头,插⼊数据的长度ushort t_len = (ushort)(sendOCRByte.length());out << t_len;qDebug() << "板坯报⽂长度:" << t_len;//52//发送数据|多例if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){socketList[i]->write(sendOCRByte);socketList[i]->flush();}}}//发送⼼跳报⽂void TCPthread::HeratPack() {if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){//⽤于⼼跳报⽂要发送的数据QByteArray sendHeartByte;//使⽤数据流写⼊数据QDataStream out(&sendHeartByte, QIODevice::WriteOnly);//设置⼩端模式out.setByteOrder(QDataStream::LittleEndian);//占位符,这⾥必须要先这样占位,然后后续读算出整体长度后在插⼊out << ushort(0) << m_heartPackID ;//回到⽂件开头,插⼊数据的长度out.device()->seek(0);ushort len = (ushort)(sendHeartByte.size());out << len;//4qDebug() <<"⼼跳报⽂长度:" << len << "⼼跳报⽂ID:" << m_heartPackID;//往套接字缓存中写⼊数据,并发送socketList[i]->write(sendHeartByte);socketList[i]->flush();}}}TCPthread::~TCPthread(){//主动和客户端断开连接if (socketList.size() != 0) {for (int i = 0; i < socketList.size(); i++){socketList[i]->disconnectFromHost();socketList[i]->close();socketList[i] = NULL;delete socketList[i];}}delete tcpServer;}遇到的问题:1、⼼跳报⽂中为发送4个字节长度报⽂:两个quint16类型的数据均占2个字节,甲⽅并要求使⽤⼩端模式解决办法:使⽤QByteArray字节数组进⾏写⼊2、数据报⽂中,需使⽤ushort类型2个占4个字节和48个字节字符串共52个字节解决办法:前⾯ushort类型使⽤QDataStraem类型写到QByteArray中。

qt的tcp通信编程

qt的tcp通信编程

qt的tcp通信编程
Qt是一款跨平台的C++应用程序框架,提供了丰富的类库和工具,可以用于开发各种类型的应用程序,包括网络应用程序。

Qt的网络
模块提供了一种简单易用的TCP/IP通信编程接口,使得用户可以轻
松地开发网络应用程序。

在Qt中进行TCP通信编程,需要涉及到各种网络相关的类,例
如QTcpSocket、QTcpServer、QHostAddress等。

其中,QTcpSocket
是最常用的网络对象,它可以作为客户端和服务器端的通信对象,用于建立TCP连接、发送数据和接收数据等操作。

QTcpServer则用于
创建服务器端,负责接收客户端的连接请求,当有客户端连接成功后,它会创建一个QTcpSocket对象,用于与客户端进行通信。

为了进行TCP通信,在Qt中需要先建立TCP连接。

这可以通过QTcpSocket的connectToHost()函数实现,该函数需要指定目标主机的IP地址和端口号。

一旦连接建立成功,就可以使用QTcpSocket的write()函数向对方发送数据,同时使用readyRead()信号和read()
函数来接收对方发送的数据。

除了QTcpSocket和QTcpServer,Qt还提供了其他一些类来实现TCP通信,例如QUdpSocket、QSslSocket等。

无论使用哪种类,Qt
的网络模块都提供了一种简单易用的TCP/IP通信编程接口,使得用
户可以快速开发网络应用程序。

- 1 -。

qt qtcpsocket 用法

qt qtcpsocket 用法

qt qtcpsocket 用法Qt是一种跨平台的C++应用程序开发框架,它提供了许多功能强大的类库和工具,可以帮助开发者快速构建高质量的应用程序。

其中,Qt的网络模块提供了一系列的类和函数,用于实现网络通信功能。

其中,QTcpSocket是Qt网络模块中的一个重要类,它提供了TCP 协议的客户端实现。

QTcpSocket类的使用非常简单,只需要创建一个QTcpSocket对象,然后调用connectToHost()函数连接到服务器即可。

连接成功后,可以使用write()函数向服务器发送数据,使用read()函数读取服务器返回的数据。

当然,在使用QTcpSocket类时,还需要处理一些错误和异常情况,例如连接失败、数据读取超时等。

下面是一个简单的QTcpSocket示例程序:```cpp#include <QtNetwork/QTcpSocket>#include <QCoreApplication>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QTcpSocket socket;socket.connectToHost("127.0.0.1", 1234);if (socket.waitForConnected()) {socket.write("Hello, world!");if (socket.waitForReadyRead()) {QByteArray data = socket.readAll();qDebug() << "Received data:" << data;} else {qDebug() << "Read data timeout!";}} else {qDebug() << "Connect to server failed!";}return a.exec();}```在这个示例程序中,我们创建了一个QTcpSocket对象,并使用connectToHost()函数连接到本地IP地址为127.0.0.1,端口号为1234的服务器。

qnetworkreply 例程

qnetworkreply 例程

qnetworkreply 例程`QNetworkReply` 是Qt 框架中的一个类,它提供了对网络操作的抽象,例如GET 和POST 请求。

在Qt 中,`QNetworkReply` 是一个常用的类,用于处理网络请求和响应。

以下是一个使用`QNetworkReply` 的简单例程,该例程向一个HTTP 服务器发送一个GET 请求,并处理服务器返回的响应:```cpp#include <QCoreApplication>#include <QNetworkAccessManager>#include <QNetworkRequest>#include <QNetworkReply>#include <QDebug>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QNetworkAccessManager manager;QNetworkRequest request;// 设置请求的URLrequest.setUrl(QUrl("输入网址"));// 发送GET 请求QNetworkReply *reply = manager.get(request);// 连接信号槽,处理响应connect(reply, &QNetworkReply::finished, [&]() { if (reply->error() == QNetworkReply::NoError) { // 成功情况下,处理数据QByteArray data = reply->readAll();qDebug() << "Response:" << data;} else {// 处理错误qDebug() << "Error:" << reply->errorString();}// 删除网络回复对象reply->deleteLater();});return a.exec();}```在这个例程中,我们首先包含了必要的头文件,然后创建了一个`QNetworkAccessManager` 实例和一个`QNetworkRequest` 对象。

qtcpsocket编程简单例子

qtcpsocket编程简单例子

qtcpsocket编程简单例子qtcpsocket是Qt网络模块中的一个类,用于实现TCP协议的网络通信。

通过qtcpsocket,我们可以方便地实现客户端和服务器之间的数据传输。

下面将列举一些使用qtcpsocket编程的简单示例,以帮助读者更好地理解和掌握该类的使用。

1. 基本的客户端和服务器通信在客户端中创建一个qtcpsocket对象,并连接到服务器的IP地址和端口号,然后通过write方法发送数据到服务器,再通过readyRead信号接收服务器返回的数据。

2. 客户端的异步通信使用qtcpsocket的异步通信特性,可以在客户端中使用waitForConnected和waitForBytesWritten方法,实现在连接成功和数据发送成功后进行相应操作。

3. 服务器端的多线程通信在服务器端,可以使用多线程来处理多个客户端的连接请求。

通过创建一个qtcpsocket对象和一个新的线程,将客户端的连接传递给新线程中的qtcpsocket对象进行处理。

4. 客户端的数据加密传输在客户端中,可以使用qtcpsocket的加密功能,将数据进行加密后发送给服务器。

服务器端接收到数据后,再进行解密操作,以确保数据的安全性。

5. 服务器端的数据压缩传输在服务器端,可以使用qtcpsocket的压缩功能,将数据进行压缩后发送给客户端。

客户端接收到数据后,再进行解压缩操作,以减少数据的传输量。

6. 客户端和服务器的心跳检测通过定时发送心跳包,客户端和服务器可以相互检测对方是否在线。

如果对方长时间没有响应,则可以判断对方已经掉线。

7. 客户端和服务器的断线重连如果客户端和服务器之间的连接断开,可以通过捕捉连接错误信号,然后重新连接到服务器。

8. 客户端和服务器的数据持久化通过将数据保存到本地文件或数据库中,可以实现数据的持久化。

在客户端和服务器之间传输数据时,可以将数据进行序列化和反序列化操作。

9. 客户端和服务器的文件传输通过qtcpsocket的数据传输功能,可以在客户端和服务器之间传输文件。

qt下的udptcp网络编程

qt下的udptcp网络编程

qt下的udptcp网络编程qt下的udp、tcp网络编程QT网络编程——TCP Itcp即transmissioncontrolprotocol,传输控制协议。

与udp不同,它是面向连接和数据流的可靠传输协议。

也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用tcp协议。

TCP协议程序使用客户机/服务器模式。

QT中提供了Qtcpsocket类来编写客户端程序,qtcpserver类用来编写服务器程序。

我们监控服务器端的端口。

一旦找到客户端的连接请求,我们将发送一个newConnection()信号。

我们可以将这个信号与我们自己的插槽函数相关联来发送数据。

在客户端,一旦数据到达,它将发送readyread()信号。

我们可以把这个信号与接收数据联系起来。

实际上,在程序中最难理解的是程序的发送和接收。

为了让您更好地理解,我们在本节中只讨论一个传输简单字符串的示例,然后在下一节中对其进行扩展,以实现任何文件的传输。

1、服务器端。

在服务器端的程序中,我们监听本地主机的一个端口,这里使用6666,然后我们关联Newconnection()信号和sendmessage()插槽函数由您自己编写。

也就是说,一旦有来自客户端的连接请求,就会执行SendMessage()函数。

在这个函数中,我们发送一个简单的字符串。

1.我们新建qt4guiapplication,工程名为“tcpserver”,选中qtnetwork模块,baseclass选择qwidget。

(说明:如果一些qtcreator版本没有添加模块一项,我们就需要在工程文件tcpserver.pro中添加一行代码:qt+=network)2.我们正在小部件中,在UI设计区域添加一个标签,并将其objectname更改为statuslabel,以显示一些状态信息。

详情如下:3.在widget.h文件中做以下更改。

网络程序设计实验代码

网络程序设计实验代码

实验一:UDP传输Server端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#define MAX_BUF 65536int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}/*socket()*/SOCKET sock;sock=socket(AF_INET,SOCK_DGRAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scokt() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}sockaddr_in LocalAddr;//定义变量LocalAddr.sin_family=AF_INET;//指定网络类型LocalAddr.sin_port=htons(20000);//绑定到20000端口,以后接收对端口发送到该端口上的数据LocalAddr.sin_addr.s_addr=inet_addr("172.17.195.171");err=bind(sock,(sockaddr*)&LocalAddr,sizeof(LocalAddr));if(SOCKET_ERROR==err){printf("bind() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}char rbuf[MAX_BUF];memset(rbuf,0,MAX_BUF);sockaddr_in RemoteAddr;//定义变量int RemoteLen=sizeof(RemoteAddr);int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);if(SOCKET_ERROR==rByte){printf("recvfrom() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}printf("UDP recv [%d]DA TA from %s %s\n",rByte,inet_ntoa(RemoteAddr.sin_addr),rbuf);//sockaddr_in RemoteAddr;int sByte=sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));if(SOCKET_ERROR==sByte){printf("sendto() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}WSACleanup();return 0;}Client端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#define MAX_BUF 65536int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}SOCKET sock;sock=socket(AF_INET,SOCK_DGRAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scokt() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}printf("请输入信息!");char data[20];scanf("%s",data);char dest_ip[]="172.17.195.171";unsigned short dest_port=20000;sockaddr_in RemoteAddr;RemoteAddr.sin_family=AF_INET;RemoteAddr.sin_port=htons(dest_port);RemoteAddr.sin_addr.s_addr=inet_addr(dest_ip);int sByte=sendto(sock,data,strlen(data),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));if(SOCKET_ERROR==sByte){printf("sendto() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}char rbuf[MAX_BUF];memset(rbuf,0,MAX_BUF);//sockaddr_in RemoteAddr;//定义变量int RemoteLen=sizeof(RemoteAddr);int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);if(SOCKET_ERROR==rByte){printf("recvfrom() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}printf("UDP recv [%d]DA TA from %s %s\n",rByte,inet_ntoa(RemoteAddr.sin_addr),rbuf);WSACleanup();return 0;}实验二:UDP文件传输Server端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#define MAX_BUF 65536int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}//socket()SOCKET sock;sock=socket(AF_INET,SOCK_DGRAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scokt() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}//绑定bind()sockaddr_in LocalAddr;//定义变量LocalAddr.sin_family=AF_INET;//指定网络类型LocalAddr.sin_port=htons(20000);//绑定到20000端口,以后接收对端口发送到该端口上的数据LocalAddr.sin_addr.s_addr=inet_addr("172.17.195.171");err=bind(sock,(sockaddr*)&LocalAddr,sizeof(LocalAddr));if(SOCKET_ERROR==err){printf("bind() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}//接收char rbuf[MAX_BUF];memset(rbuf,0,MAX_BUF);sockaddr_in RemoteAddr;//定义变量int RemoteLen=sizeof(RemoteAddr);int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);if(SOCKET_ERROR==rByte){printf("recvfrom() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}printf("UDP recv [%d]DA TA from %s %s\n",rByte,inet_ntoa(RemoteAddr.sin_addr),rbuf);printf("发送%s文件给%s\n",rbuf,inet_ntoa(RemoteAddr.sin_addr));// file()FILE *fp;if((fp=fopen("e:\\唐爱华\\hello.txt","r"))==NULL){printf("Cannot open the file!\n");exit(0);}while(!feof(fp)){memset(rbuf,0,MAX_BUF);fread(&rbuf,sizeof(rbuf),1,fp);//发送int sByte=sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));if(SOCKET_ERROR==sByte){printf("sendto() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}}fclose(fp);closesocket(sock);WSACleanup();return 0;}client端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#define MAX_BUF 65536int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}SOCKET sock;sock=socket(AF_INET,SOCK_DGRAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scokt() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}char data[]=”hello”;char dest_ip[]="172.17.195.171";unsigned short dest_port=20000;sockaddr_in RemoteAddr;RemoteAddr.sin_family=AF_INET;RemoteAddr.sin_port=htons(dest_port);RemoteAddr.sin_addr.s_addr=inet_addr(dest_ip);int sByte=sendto(sock,data,strlen(data),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));if(SOCKET_ERROR==sByte){printf("sendto() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}char rbuf[MAX_BUF];memset(rbuf,0,MAX_BUF);int RemoteLen=sizeof(RemoteAddr);FILE *fp;if((fp=fopen("e:\\唐爱华\\client.txt","w"))==NULL){printf("Cannot open the file!\n");exit(0);}while(!feof(fp)){int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);if(SOCKET_ERROR==rByte){printf("recvfrom() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}//printf("UDP recv [%d]DA TA from %s %s\n",rByte,inet_ntoa(RemoteAddr.sin_addr),rbuf);fwrite(&rbuf,sizeof(rbuf),1,fp);}fclose(fp);closesocket(sock);WSACleanup();return 0;}实验三:TCP文件传输Server端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#include<memory.h> //for memset()int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}//socket()SOCKET sock;sock=socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scoket() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}//绑定bind()sockaddr_in LocalAddr;//定义变量LocalAddr.sin_family=AF_INET;//指定网络类型LocalAddr.sin_port=htons(20000);//绑定到20000端口LocalAddr.sin_addr.s_addr=htonl(INADDR_ANY);err=bind(sock,(sockaddr*)&LocalAddr,sizeof(LocalAddr));if(SOCKET_ERROR==err){printf("bind() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}err = listen(sock,5);if(SOCKET_ERROR==err){printf("listen() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}sockaddr_in ClientAddr;int AddrLen = sizeof(ClientAddr);FILE *fp;while(1){SOCKET sockConnected = accept(sock,(sockaddr*)&ClientAddr,&AddrLen);if(INV ALID_SOCKET==sockConnected)//出错处理{printf("accpet() Failed:%d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}char rbuf[1024];while(1){memset(rbuf,0,1024);int rByte = recv(sockConnected,rbuf,1024,0);if(SOCKET_ERROR==rByte){printf("recv() Failed: %d\n",WSAGetLastError());closesocket(sock);break;}if(0==rByte) //对方关闭连接{printf("Connection is closed.\n");shutdown(sockConnected,SD_SEND);closesocket(sockConnected);break;}printf("TCP recv[%d]DA TA:%s\n",rByte,rbuf);//printf("Send the file '%s' to %s\n",rbuf,inet_ntoa(Dest_Addr.sin_addr));if((fp=fopen("e:\\唐爱华\\hello.txt","r"))==NULL){printf("Cannot open the file!\n");exit(0);}memset(rbuf,0,1024);fread(&rbuf,sizeof(rbuf),1,fp);int sByte = send(sockConnected,rbuf,sizeof(rbuf),0);if(SOCKET_ERROR==sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(sockConnected);break;}fclose(fp);}}closesocket(sock);WSACleanup();return 0;}Client端:#pragma comment(lib,"ws2_32.lib")#include<Winsock2.h>#include<stdio.h>#include<string.h> //for strlen()#include<memory.h> //for memset()int main(){WSAData wsaData;int err=WSAStartup(WINSOCK_VERSION,&wsaData);if(0!=err){return -1;}SOCKET sock;sock=socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET==sock)//出错处理{printf("scoket() Failed:%d\n",WSAGetLastError());WSACleanup();return -1;}sockaddr_in ServerAddr;ServerAddr.sin_family=AF_INET;ServerAddr.sin_port=htons(20000);ServerAddr.sin_addr.s_addr=inet_addr("172.17.195.171");err = connect(sock,(sockaddr*)&ServerAddr,sizeof(ServerAddr));if(SOCKET_ERROR==err){printf("connect() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}char data[] = "hello";printf("向服务器发送想要下载的文件:hello\n");int sByte = send(sock,data,strlen(data),0);if(SOCKET_ERROR==sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}shutdown(sock,SD_SEND); //close connectFILE *fp;fp=fopen("e:\\唐爱华\\client.txt","w");if(fp==NULL){printf("Cannot open the file !\n");exit(0);}char rbuf[1024];while(1){memset(rbuf,0,1024);int rByte = recv(sock,rbuf,1024,0);fwrite(&rbuf,sizeof(rbuf),1,fp);if(SOCKET_ERROR==rByte){printf("recv() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}if(0==rByte) //对方关闭连接{printf("Connection is closed.\n");break;}printf("TCP recv[%d]DA TA:%s\n",rByte,rbuf);}fclose(fp);closesocket(sock);WSACleanup();return 0;}实验四:TCP多人聊天Server端:#pragma comment(lib,"ws2_32.lib")#include"stdio.h"#include"string.h"#include"Winsock2.h"#include"memory.h"#define MAX_BUF 65535#define MAX_CLIENT_NUM 63#define MSG_MAX_SIZE 1024int main(){WSADATA wsaData;int err = WSAStartup(MAKEWORD(2,2),&wsaData);if(err != 0){printf("Error at WSAStartup()\n");return -1;}/* socket() */SOCKET ListenSock;ListenSock = socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET == ListenSock){printf("ListenSock() Failed: %d\n",WSAGetLastError());WSACleanup();return -1;}/* bind() */sockaddr_in Local_Addr;Local_Addr.sin_family = AF_INET;Local_Addr.sin_port = htons(27015);Local_Addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);err = bind(ListenSock,(sockaddr*)&Local_Addr,sizeof(Local_Addr));if(SOCKET_ERROR == err){printf("bind() Failed: %d\n",WSAGetLastError());closesocket(ListenSock);WSACleanup();return -1;}/* listen() */err = listen(ListenSock,2);if(SOCKET_ERROR == err){printf("listen() Failed: %d\n",WSAGetLastError());closesocket(ListenSock);WSACleanup();return -1;}SOCKET client[MAX_CLIENT_NUM];for(int i = 0;i < MAX_CLIENT_NUM;i++){client[i] = INV ALID_SOCKET;}fd_set rset,allset;FD_ZERO(&allset);FD_SET(ListenSock,&allset);char buf[MAX_CLIENT_NUM][MSG_MAX_SIZE];for(;;){rset = allset;int ret = select(0,&rset,NULL,NULL,NULL);if(ret == SOCKET_ERROR){printf("select() Failed: %d\n",WSAGetLastError());break;}if(ret == 0){continue;}if(FD_ISSET(ListenSock,&rset)){struct sockaddr_in cliaddr;int client_len = sizeof(cliaddr);SOCKET sockConnected = accept(ListenSock,(sockaddr*)&cliaddr,&client_len);if(INV ALID_SOCKET == sockConnected){printf("accept() Failed: %d\n",WSAGetLastError());break;}int i;for(i = 0;i < MAX_CLIENT_NUM;i++){if(client[i] == INV ALID_SOCKET){client[i] = sockConnected;break;}}if(i < MAX_CLIENT_NUM){FD_SET(sockConnected,&allset);}else{printf("too many clients");closesocket(sockConnected);}}for(int i = 0;i < MAX_CLIENT_NUM;i++){if(client[i] != INV ALID_SOCKET && FD_ISSET(client[i],&rset)){memset(buf[i],0,MSG_MAX_SIZE);int rByte = recv(client[i],buf[i],MSG_MAX_SIZE,0);if(SOCKET_ERROR == rByte){printf("recv() Failed: %d\n",WSAGetLastError());FD_CLR(client[i],&allset);closesocket(client[i]);client[i] = INV ALID_SOCKET;continue;}if(0 == rByte){/* 客户端的连接已关闭*/printf("the connection of the Client is closed. \n");FD_CLR(client[i],&allset);closesocket(client[i]);client[i] = INV ALID_SOCKET;continue;}printf("Server recv[%d]Data from client[%d]: %s\n",rByte,i,buf[i]);for(int k = 0;k < MAX_CLIENT_NUM;k++){if(k == i) continue;else if(client[k] != INV ALID_SOCKET && FD_ISSET(client[k],&rset)){int sByte = send(client[k],buf[k],strlen(buf[k]),0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(client[k]);WSACleanup();break;}}}}}}/* closesocket() */closesocket(ListenSock);WSACleanup();return 0;}Client端:#pragma comment(lib,"ws2_32.lib")#include"stdio.h"#include"string.h"#include"Winsock2.h"#include"memory.h"#include"windows.h"#include"process.h"#define MAX_BUF 65535#define MAX_SIZE 1024void _cdecl Get_keyboard_input(void *param){SOCKET paramSock = (SOCKET)param;while(1){char input[MAX_SIZE];printf("please input data: \n");gets(input);/* send() */int sByte = send(paramSock,input,strlen(input),0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(paramSock);WSACleanup();break;}}}void _cdecl Get_data_server(void * param){SOCKET paramSock = (SOCKET)param;/* recvfrom() */char rbuf[MAX_BUF];int rByte;do{memset(rbuf,0,MAX_BUF);rByte = recv(paramSock,rbuf,MAX_BUF,0);if(SOCKET_ERROR == rByte){printf("recv() Failed: %d\n",WSAGetLastError());closesocket(paramSock);WSACleanup();break;}if(0 == rByte){/* 客户端的连接已关闭*/printf("the connection of the Server is closed. \n");break;}printf("Client recv[%d]Data from server: %s\n",rByte,rbuf);Sleep(500);}while(1);}int main(){WSADATA wsaData;int err = WSAStartup(WINSOCK_VERSION , &wsaData);if(0 != err){return -1;}/* socket() */SOCKET sock;sock = socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET == sock){printf("sock() Failed: %d\n",WSAGetLastError());WSACleanup();return -1;}/* connect() */char Dest_ip[] = "172.17.195.171";unsigned short Dest_port = 27015;sockaddr_in Dest_Addr;Dest_Addr.sin_family = AF_INET;Dest_Addr.sin_port = htons(Dest_port);Dest_Addr.sin_addr.S_un.S_addr = inet_addr(Dest_ip);err = connect(sock,(sockaddr*)&Dest_Addr,sizeof(Dest_Addr));if(SOCKET_ERROR == err){printf("connect() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}/* _beginthread() */_beginthread(Get_keyboard_input,0,(void*)sock);while(1){/* _beginthread() */_beginthread(Get_data_server,0,(void*)sock);}Sleep(INFINITE);closesocket(sock);WSACleanup();return 0;}实验五:多人聊天发私信Server端:#pragma comment(lib,"ws2_32.lib")#include"stdio.h"#include"string.h"#include"Winsock2.h"#include"memory.h"#define MAX_BUF 65535#define MAX_CLIENT_NUM 63#define MSG_MAX_SIZE 1024int main(){WSADATA wsaData;int err = WSAStartup(MAKEWORD(2,2),&wsaData);if(err != 0){printf("Error at WSAStartup()\n");return -1;}/* socket() */SOCKET ListenSock;ListenSock = socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET == ListenSock){printf("ListenSock() Failed: %d\n",WSAGetLastError());WSACleanup();return -1;}/* bind() */sockaddr_in Local_Addr;Local_Addr.sin_family = AF_INET;Local_Addr.sin_port = htons(27015);Local_Addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);err = bind(ListenSock,(sockaddr*)&Local_Addr,sizeof(Local_Addr)); if(SOCKET_ERROR == err){printf("bind() Failed: %d\n",WSAGetLastError());closesocket(ListenSock);WSACleanup();return -1;}/* listen() */err = listen(ListenSock,5);if(SOCKET_ERROR == err){printf("listen() Failed: %d\n",WSAGetLastError());closesocket(ListenSock);WSACleanup();return -1;}SOCKET client[MAX_CLIENT_NUM];for(int i = 0;i < MAX_CLIENT_NUM;i++){client[i] = INV ALID_SOCKET;}fd_set rset,allset;FD_ZERO(&allset);FD_SET(ListenSock,&allset);char buf[MAX_CLIENT_NUM][MSG_MAX_SIZE];char record[MAX_CLIENT_NUM][MSG_MAX_SIZE];bool flag = false;for(;;){rset = allset;int ret = select(0,&rset,NULL,NULL,NULL);if(ret == SOCKET_ERROR){printf("select() Failed: %d\n",WSAGetLastError());break;}if(ret == 0){continue;}if(FD_ISSET(ListenSock,&rset)){struct sockaddr_in cliaddr;int client_len = sizeof(cliaddr);SOCKET sockConnected = accept(ListenSock,(sockaddr*)&cliaddr,&client_len);if(INV ALID_SOCKET == sockConnected){printf("accept() Failed: %d\n",WSAGetLastError());break;}int i;for(i = 0;i < MAX_CLIENT_NUM;i++){if(client[i] == INV ALID_SOCKET){client[i] = sockConnected;flag = true;break;}}if(i < MAX_CLIENT_NUM){FD_SET(sockConnected,&allset);}else{printf("too many clients");closesocket(sockConnected);}}//int Username[MSG_MAX_SIZE];//char Bind[] = "请输入用户名: \n";for(int i = 0;i < MAX_CLIENT_NUM;i++){if(client[i] != INV ALID_SOCKET && FD_ISSET(client[i],&rset)) {//int S = send(client[i],Bind,strlen(Bind),0);memset(buf[i],0,MSG_MAX_SIZE);int rByte = recv(client[i],buf[i],MSG_MAX_SIZE,0);if(SOCKET_ERROR == rByte){printf("recv() Failed: %d\n",WSAGetLastError());FD_CLR(client[i],&allset);closesocket(client[i]);client[i] = INV ALID_SOCKET;continue;}if(0 == rByte){/* 客户端的连接已关闭*/printf("the connection of the Client is closed. \n");FD_CLR(client[i],&allset);closesocket(client[i]);client[i] = INV ALID_SOCKET;continue;}if(flag == true){char a[] = "登陆成功!";char w[] = "@";strcpy(record[i],buf[i]);strcat(w,record[i]);strcpy(record[i],w);//printf("%s",record[i]);strcat(buf[i],a);flag = false;}printf(" %s \n",buf[i]);char *c;c = strchr(buf[i],'@');int k;if(c != NULL){for(k=0;client[k]!=INV ALID_SOCKET;k++){if(strcmp(record[k],c)==0){int sByte = send(client[k],buf[i],rByte,0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(client[k]);WSACleanup();break;}break;}}if(k > i){char q[] = "找不到该用户";int sByte = send(client[i],q,strlen(q),0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(client[k]);WSACleanup();break;}}}else{for(int k = 0;k < MAX_CLIENT_NUM;k++){if(client[k] != INVALID_SOCKET){if(k == i) continue;int sByte = send(client[k],buf[i],rByte,0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(client[k]);WSACleanup();break;}}}}}}}/* closesocket() */closesocket(ListenSock);WSACleanup();return 0;}Client端:#pragma comment(lib,"ws2_32.lib")#include"stdio.h"#include"string.h"#include"Winsock2.h"#include"memory.h"#include"windows.h"#include"process.h"#define MAX_BUF 65535#define MAX_SIZE 1024/*void _cdecl Online_inform(void *param){SOCKET paramSock = (SOCKET)param;printf("请输入用户名: ");char Username[MAX_SIZE];gets(Username);//char a[] = "登陆成功";//strcat(Username,a);int sByte = send(paramSock,Username,strlen(Username),0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(paramSock);WSACleanup();}}*/void _cdecl Get_keyboard_input(void *param){SOCKET paramSock = (SOCKET)param;printf("请输入用户名: ");char Username[MAX_SIZE];gets(Username);//int len = sizeof(Username);while(strcmp(Username,"")==0){printf("登陆失败!用户名不能为空!\n");//_beginthread(Get_keyboard_input,0,(void*)paramSock);printf("请输入用户名: ");//char Username[MAX_SIZE];gets(Username);}//char a[] = "登陆成功";//strcat(Username,a);int sByte = send(paramSock,Username,strlen(Username),0);char myname[] = ":";strcat(Username,myname);while(1){char input[MAX_SIZE];char name[1024];int i;for(i=0;Username[i]!=0;i++){name[i] = Username[i];}name[i] = '\0';//printf("please input data: \n");gets(input);/* send() */strcat(name,input);int sByte = send(paramSock,name,strlen(name),0);if(SOCKET_ERROR == sByte){printf("send() Failed: %d\n",WSAGetLastError());closesocket(paramSock);WSACleanup();break;}}}void _cdecl Get_data_server(void * param){SOCKET paramSock = (SOCKET)param;/* recvfrom() */char rbuf[MAX_BUF];int rByte;do{memset(rbuf,0,MAX_BUF);rByte = recv(paramSock,rbuf,MAX_BUF,0);if(SOCKET_ERROR == rByte){printf("recv() Failed: %d\n",WSAGetLastError());closesocket(paramSock);WSACleanup();break;}if(0 == rByte){/* 客户端的连接已关闭*/printf("the connection of the Server is closed. \n");break;}printf("%s\n",rbuf);Sleep(500);}while(1);}int main(){WSADATA wsaData;int err = WSAStartup(WINSOCK_VERSION , &wsaData);if(0 != err){return -1;}/* socket() */SOCKET sock;sock = socket(AF_INET,SOCK_STREAM,0);if(INV ALID_SOCKET == sock){printf("sock() Failed: %d\n",WSAGetLastError());WSACleanup();return -1;}/* connect() */char Dest_ip[] = "172.17.195.171";unsigned short Dest_port = 27015;sockaddr_in Dest_Addr;Dest_Addr.sin_family = AF_INET;Dest_Addr.sin_port = htons(Dest_port);Dest_Addr.sin_addr.S_un.S_addr = inet_addr(Dest_ip);err = connect(sock,(sockaddr*)&Dest_Addr,sizeof(Dest_Addr));if(SOCKET_ERROR == err){printf("connect() Failed: %d\n",WSAGetLastError());closesocket(sock);WSACleanup();return -1;}/* _beginthread() *///_beginthread(Online_inform,0,(void*)sock);/* _beginthread() */_beginthread(Get_keyboard_input,0,(void*)sock);/* _beginthread() */_beginthread(Get_data_server,0,(void*)sock);Sleep(INFINITE);/* closesocket() */closesocket(sock);WSACleanup();return 0;}。

QT源码分析:QTcpServer

QT源码分析:QTcpServer

QT源码分析:QTcpServer最近在看有关IO复⽤⽅⾯的内容,⾃⼰也⽤标准c++库实现了select模型、iocp模型、poll模型。

回过头来很想了解QT的socket是基于什么模型来实现的,所以看了QT关于TcpServer实现的相关源码,现在将所了解的内容记录下来,希望对感兴趣的朋友有所帮助。

1.我们先从QTcpServer的构造函数来看,下⾯是QTcpServer的构造函数原型:QTcpServer::QTcpServer(QObject *parent): QObject(*new QTcpServerPrivate, parent){Q_D(QTcpServer);#if defined(QTCPSERVER_DEBUG)qDebug("QTcpServer::QTcpServer(%p)", parent);#endifd->socketType = QAbstractSocket::TcpSocket;} 我们可以看到⾸先创建了⼀个QTcpServerPrivate的参数类,在QT源码中,每⼀个类都有⼀个参数类,参数类的类名是:类名+Private,这个类主要放置QTcpServer类中会使⽤到的⼀些成员对象,⽽QTcpServer⾥⾯只会定义⽅法不会有成员对象了。

然后构造函数内部实现很简单:Q_D(QTcpServer);这个宏实际上就是取到QTcpServerPrivate对象的指针赋给变量d,d->socketType = QAbstractSocket::TcpSocket;把套接字类型设置为Tcp。

那么第⼀步构造函数的⼯作就结束了。

2. 当我们调⽤listen函数以后,tcpserver就启动了,之后连接,接收数据和发送数据完成都可以通过信号来接收,那么QT具体是如何实现等待连接和等待接收数据的呢,对于不同平台⼜是怎么实现的,我们来分析⼀下listen函数做了什么⼯作。

qt tcp 通信例程

qt tcp 通信例程

qt tcp通信例程以下是一个使用Qt实现的简单的TCP通信例程,其中包括服务器端和客户端的代码。

在这个例程中,服务器端监听端口,接受客户端连接,并接收和发送数据。

客户端连接到服务器端,并发送一条消息给服务器。

服务器端代码:```cpp//server.cpp#include<QTcpServer>#include<QTcpSocket>#include<QDebug>int main(){QTcpServer server;//监听端口if(!server.listen(QHostAddress::Any,12345)){qDebug()<<"Server could not start!";return1;}qDebug()<<"Server started!";while(true){//等待新的连接if(server.waitForNewConnection(-1)){QTcpSocket*socket=server.nextPendingConnection();//读取数据QByteArray data=socket->readAll();qDebug()<<"Received:"<<data;//发送数据socket->write("Hello from server!"); socket->waitForBytesWritten();}}return0;}```客户端代码:```cpp//client.cpp#include<QTcpSocket>#include<QDebug>int main(){QTcpSocket socket;//连接到服务器socket.connectToHost("127.0.0.1",12345); if(socket.waitForConnected(1000)){//发送数据socket.write("Hello from client!"); socket.waitForBytesWritten();//读取数据QByteArray data=socket.readAll(); qDebug()<<"Received:"<<data;//关闭连接socket.disconnectFromHost();}else{qDebug()<<"Failed to connect to server!";}return0;}```在这个例程中,服务器监听在本地的12345端口上,客户端连接到这个端口。

qt tcp 通信 例子

qt tcp 通信 例子

qt tcp 通信例子以下是一个简单的Qt TCP通信示例,包括服务器端和客户端的实现。

服务器端代码:cpp复制代码#include <QTcpServer>#include <QTcpSocket>#include <QMessageBox>class MyServer : public QTcpServer{Q_OBJECTpublic:explicit MyServer(QObject *parent = nullptr) : QTcpServer(parent) {if (!this->listen(QHostAddress::Any, 1234)) {QMessageBox::critical(nullptr, "Server Error", "Unable to start the server:" + this->errorString());exit(EXIT_FAILURE);}}protected:void incomingConnection(qintptr socketDescriptor) override {QTcpSocket *clientSocket = new QTcpSocket(this);clientSocket->setSocketDescriptor(socketDescriptor);connect(clientSocket, &QTcpSocket::readyRead, this, [clientSocket]() {QByteArray data = clientSocket->readAll();clientSocket->write(data); // echo back the data received});connect(clientSocket, &QTcpSocket::disconnected, this, [clientSocket]() { clientSocket->deleteLater();});}};客户端代码:cpp复制代码#include <QTcpSocket>#include <QHostAddress>#include <QMessageBox>class MyClient : public QObject {Q_OBJECTpublic:explicit MyClient(QObject *parent = nullptr) : QObject(parent) {QTcpSocket *socket = new QTcpSocket(this);socket->connectToHost(QHostAddress::LocalHost, 1234);if (socket->waitForConnected()) {socket->write("Hello, world!");if (socket->waitForBytesWritten()) {if (socket->waitForReadyRead()) {QByteArray data = socket->readAll();QMessageBox::information(nullptr, "Client", "Received data: " + data);}} else {QMessageBox::critical(nullptr, "Client Error", "Unable to send data:" + socket->errorString());}} else {QMessageBox::critical(nullptr, "Client Error", "Unable to connect to the server:" + socket->errorString());}}};在这个例子中,服务器监听1234端口,客户端连接到该端口并发送一条消息。

基于Qt的TCP网络编程研究与应用

基于Qt的TCP网络编程研究与应用
x r m类 、 D tSr m 类 、 B tA ry 代表 数据 已经 被完 整地 接收 .接收 到 的有 可能是一 包 Se Q a ta a e Q ye r a 类 。需 注意 的是 , T p ok tQ c Sre 类 是 需 要事 不完整 的数据 、 Q c Sc e、 T p evr 一包 完整 的数 据 、 若干 包完整 的数据 和 件 机制支 持的 。 因此为 了使 程序正 常运 行 , 要在 程序 中 包不完 整 的数据 、 若干包 完整 的数 据等多种 情况 。 所 开启 事件循环 或者调用 相应 的事 件响应 函数 。 以在处理数 据时要考 虑到所 有 的情 况 .以免错误 解析 数 据 。读取 数据前 . 以用 b ts v i be 返 回缓存 中 可 yeA a a l l 0 1 T pokt . Q cSce类 1 接 收到 的字 节数 ( 用 于基 于 块 的协议 ) 适 ,或 用 c1 a. 1 Q c Sc e 类 继 承 自 Q b t c okt .它提 供 T p ok t A s at c e 类 r S
上 。而 网 络 程 序 又 是 软 件 开发 的 主 要 方 面 之 一 。所 以本 文 对 如 何 利 用 Qt 开发 T CP网 络 程 序 进 行 了研 究 ,
并设计 与 实现 了一个 简单 的客 户端/ 服务 器程序 。
【 关键词 】 QtT P Sce : ; C ;okt
0 引言
服 务器 程 序展 示如 何 利用 这 些类 开 发 支持 T P协 议 根据 返 回的信号执行 相应 的函数 C
的程 序。
1 (t 、 中与 T 2 GP有 关 的 类
连 接 成 功 后 就 可 以 根 据 需 要 发 送 或 接 收数 据

实训项目3QT程序源码与编译过程

实训项目3QT程序源码与编译过程

实训项目3QT程序源码与编译过程以下是一个使用Qt编写的简单程序源码和编译过程的示例:```c++#include <QApplication>#include <QLabel>int main(int argc, char *argv[])QApplication app(argc, argv);QLabel label("Hello, Qt!");label.show(;return app.exec(;```接下来,我们将介绍如何编译这个程序。

接下来,打开终端(对于Windows用户,打开命令提示符),进入保存有`main.cpp`文件的目录。

然后,使用Qt提供的命令行工具`qmake`来创建一个项目文件(`pro`文件),用于编译和构建应用程序。

在终端中输入以下命令:```qmake -project```这会生成一个名为`<项目名称>.pro`的文件。

默认情况下,它的名字与`main.cpp`文件的名字相同。

```QT += widgets```这会告诉Qt编译器需要使用Qt Widgets模块。

保存并关闭`<项目名称>.pro`文件。

然后```qmake```这会在当前目录中生成一个名为`Makefile`的文件。

最后,使用`make`命令编译和构建应用程序:```make```这将生成一个可执行文件,其默认名称为程序的目录名。

现在,你可以运行生成的可执行文件来启动你的Qt程序:```./<可执行文件名>```这样,你的程序就会在应用程序窗口中显示出来。

这是一个简单的Qt程序的源码和编译过程的示例。

你可以根据需要修改和扩展这个程序,创建自己的Qt应用程序。

qt的源代码

qt的源代码

qt的源代码
Qt是由Trolltech公司开发的一个多平台C++图形用户界面库,它以开源的形式发布。

它可以跨越多种操作系统,包括 Windows、Linux、Mac OS 等,能够为应用程序提供功能强大的图形用户界面 ,提高应用程序的友好性。

Qt 源代码是构建 Qt 应用程序的前提。

它完整地实现了 Qt 类库,包括图形用户界面( GUI )、控制台、文件系统等功能的
C/C++ 接口,以及相关的工具(如编辑器、编译器)和应用程序的模板。

Qt 的源代码以 LGPL 协议发布,可以从官网上下载。

源代码分为多个模块,每个模块都是一个单独的文件夹,包含其中的头文件、源文件和相关工具,如 Makefile 、 qmake 等。

要编译 Qt,需要先安装 Qt 源代码所包含的工具和相关编译器。

Qt 的源代码虽然复杂,但由于它实现的是 C++ 的特性,因此也适用于熟悉 C++ 开发的人。

有了 Qt 的源代码,我们可以来实现我们所想的功能,无论复杂或简单,都可以打开源代码,做出需要的修改,给我们的应用程序添加新的功能。

- 1 -。

qt setproxy qtcpserver用法

qt setproxy qtcpserver用法

qt setproxy qtcpserver用法QT 是一款跨平台的C++ 应用程序开发框架,提供了丰富的类库和工具来开发高效、可靠、用户友好的应用程序。

在QT 中使用QTcpServer 类编写服务器程序时,可以通过setProxy 方法设置代理。

下面详细介绍QT 的setProxy 和QTcpServer 的用法。

首先,我们需要了解代理服务器的概念。

代理服务器是一种中间服务器,用于在客户端和目标服务器之间传送网络请求和响应。

它可以用于加速访问速度、控制访问权限、隐藏客户端IP 地址等。

在一些特殊的网络环境下,为了满足安全和网络控制的要求,我们可能需要使用代理服务器来进行网络通信。

在QTcpServer 类中,setProxy 方法被用来设置代理服务器。

它接受一个QNetworkProxy 类型的参数,用于指定代理服务器的配置信息。

使用代理服务器,可以在QTcpServer 类中使用以下四种代理类型之一:1. QNetworkProxy::DefaultProxy:使用系统默认的代理设置。

这是默认的代理类型。

2. QNetworkProxy::NoProxy:不使用代理服务器,直接连接目标服务器。

3. QNetworkProxy::Socks5Proxy:使用SOCKS5 代理服务器。

4. QNetworkProxy::HttpProxy:使用HTTP 代理服务器。

使用QTcpServer 类的setProxy 方法可以设置代理服务器。

例如,下面是一个使用代理服务器的示例代码:cpp#include <QtNetwork>int main(){QTcpServer server;QNetworkProxy proxy(QNetworkProxy::HttpProxy, "proxy.example", 8080);server.setProxy(proxy);server.listen(QHostAddress::Any, 1234);后续代码...return 0;}在上述代码中,我们创建了一个QTcpServer 对象server,并使用QNetworkProxy::HttpProxy 类型和代理服务器地址及端口号来初始化proxy 对象。

Qt:QTcpServer多线程示例(headeronly)

Qt:QTcpServer多线程示例(headeronly)

Qt:QTcpServer多线程⽰例(headeronly)最近在⽤QML写⼀个⼩⼯具Mock,模拟下位机数据⽤于测试中控软件,正好⽤到了QTcpServer。

这⾥分享⼀下代码,继承ClientHandle,重写⽅法即可。

做⼀个⼩demo还是⽐较⽅便的。

github链接:#ifndef SOCKETSERVER_H#define SOCKETSERVER_H#include <QTcpServer>#include <QTcpSocket>#include <QThread>#include <QMetaType>using Port = quint16;// After new client connected, a thread will be created.// Demo onlytemplate <typename ClientHandle>class SocketServer : public QTcpServer{public:SocketServer(QObject *parent = nullptr):QTcpServer(parent) {qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError");}~SocketServer() { uninit(); }public:bool init(const QString &ip_addr, const Port &port) {QHostAddress host_addr(ip_addr);return this->listen(host_addr, port);}bool uninit() {if(this->isListening()) this->close();for(auto iter = connections_.begin();iter != connections_.end();){delete (*iter);iter = connections_.erase(iter);}return true;}bool sendToAll(const QByteArray &data){for(auto iter = connections_.begin();iter != connections_.end();){if((*iter)->state() == QAbstractSocket::UnconnectedState){iter = connections_.erase(iter);continue;}else if(!(*iter)->isValid()){continue;}(*iter)->send(data);++iter;}return true;}private:void incomingConnection(qintptr handle) override {QThread *thread = new QThread();ClientHandle *tcp_client = new ClientHandle(handle, thread);connections_.push_back(tcp_client);}private:std::list<ClientHandle*> connections_;};class ClientHandle : public QTcpSocket{Q_OBJECTpublic:ClientHandle(qintptr handle, QThread *thread) {this->setSocketDescriptor(handle);connect(this, &ClientHandle::readyRead,this, &ClientHandle::onReadyRead);connect(this, &ClientHandle::sendData,this, &ClientHandle::onSendData);connect(this, &ClientHandle::disconnected,thread, &QThread::quit);this->moveToThread(thread);thread->start();}~ClientHandle() { this->disconnect(); }void send(const QByteArray &data){emit sendData(data);}protected:virtual void onHandleData(const QByteArray &, QByteArray &){ } signals:void sendData(const QByteArray &data);private slots:void onSendData(const QByteArray &data){this->write(data);}void onReadyRead(){ClientHandle *socket = (ClientHandle*)sender();QByteArray recv_bytes, send_bytes;recv_bytes = socket->readAll();onHandleData(recv_bytes, send_bytes);if(send_bytes.size() == 0) return;if(socket->write(send_bytes) == -1)qDebug()<< "Write failed.";return;}void onSocketError(QAbstractSocket::SocketError) {ClientHandle* socket = (ClientHandle*)sender();socket->disconnect();return;}};#endif // SOCKETSERVER_H。

TCP通讯代码

TCP通讯代码

1、首先是界面的设置,界面设置系统会自动在Designer.vb这个文件中记录下来,下面是该文件的代码:<pilerServices.DesignerGen erated()> _Partial Class Form1Inherits System.Windows.Forms.Form'Form overrides dispose to clean up the component list.<System.Diagnostics.DebuggerNonUserCode()> _Private Sub InitializeComponent()bel1 = New belbel2 = New belMe.TextBox1 = New System.Windows.Forms.TextBoxMe.TextBox2 = New System.Windows.Forms.TextBoxMe.BtnLink = New System.Windows.Forms.ButtonMe.BtnSend = New System.Windows.Forms.ButtonbService = New belMe.ListBoxClientContext = New System.Windows.Forms.ListBoxMe.StartService = New System.Windows.Forms.ButtonMe.StatusStrip1 = New System.Windows.Forms.StatusStripMe.ToolStripLable1 = New System.Windows.Forms.ToolStripStatusLabelMe.ToolStripSeviceStatus = New System.Windows.Forms.ToolStripStatusLabelMe.StatusStrip1.SuspendLayout()Me.SuspendLayout()''Label1'bel1.AutoSize = Truebel1.Location = New System.Drawing.Point(25, 22) = "Label1"bel1.Size = New System.Drawing.Size(77, 12)bel1.T abIndex = 0bel1.Text = "服务器地址:"''Label2'bel2.AutoSize = Truebel2.Location = New System.Drawing.Point(25, 69) = "Label2"bel2.Size = New System.Drawing.Size(41, 12)bel2.T abIndex = 1bel2.Text = "信息:"''TextBox1'Me.TextBox1.Location = New System.Drawing.Point(115, 19) = "TextBox1"Me.TextBox1.Size = New System.Drawing.Size(149, 21) Me.TextBox1.T abIndex = 2''TextBox2'Me.TextBox2.Location = New System.Drawing.Point(115, 69) = "TextBox2"Me.TextBox2.Size = New System.Drawing.Size(149, 21) Me.TextBox2.T abIndex = 3''BtnLink'Me.BtnLink.Location = New System.Drawing.Point(27, 130) = "BtnLink"Me.BtnLink.Size = New System.Drawing.Size(75, 23)Me.BtnLink.TabIndex = 4Me.BtnLink.Text = "连接"eVisualStyleBackColor = True''BtnSend'Me.BtnSend.Location = New System.Drawing.Point(177, 129) = "BtnSend"Me.BtnSend.Size = New System.Drawing.Size(75, 23)Me.BtnSend.TabIndex = 5Me.BtnSend.Text = "发送"eVisualStyleBackColor = True''LabService'bService.AutoSize = TruebService.Location = New System.Drawing.Point(25, 162) = "LabService"bService.Size = New System.Drawing.Size(77, 12) bService.TabIndex = 0bService.Text = "服务尚未启动"''ListBoxClientContext'Me.ListBoxClientContext.FormattingEnabled = TrueMe.ListBoxClientContext.ItemHeight = 12Me.ListBoxClientContext.Location = New System.Drawing.Point(27, 182) = "ListBoxClientContext"Me.ListBoxClientContext.Size = New System.Drawing.Size(245, 148)Me.ListBoxClientContext.T abIndex = 1''StartService'Me.StartService.Location = NewSystem.Drawing.Point(27, 351) = "StartService"Me.StartService.Size = New System.Drawing.Size(75, 23)Me.StartService.TabIndex = 2Me.StartService.Text = "启动服务"eVisualStyleBackColor = True''StatusStrip1'Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripLable1, Me.ToolStripSeviceStatus})Me.StatusStrip1.Location = New System.Drawing.Point(0, 399) = "StatusStrip1"Me.StatusStrip1.Size = New System.Drawing.Size(299, 22)Me.StatusStrip1.TabIndex = 6Me.StatusStrip1.Text = "StatusStrip1"''ToolStripLable1' = "ToolStripLable1"Me.ToolStripLable1.Size = New System.Drawing.Size(55, 17)Me.ToolStripLable1.Text = "无连接!"''ToolStripSeviceStatus' = "ToolStripSeviceStatus"Me.ToolStripSeviceStatus.Size = New System.Drawing.Size(91, 17)Me.ToolStripSeviceStatus.Text = "服务器无连接!"''Form1'Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.FontMe.ClientSize = New System.Drawing.Size(299, 421)Me.Controls.Add(Me.StatusStrip1)Me.Controls.Add(Me.BtnSend)Me.Controls.Add(Me.BtnLink)Me.Controls.Add(Me.TextBox2)Me.Controls.Add(Me.TextBox1)Me.Controls.Add(bel2)Me.Controls.Add(bel1)Me.Controls.Add(Me.StartService)Me.Controls.Add(Me.ListBoxClientContext)Me.Controls.Add(bService) = "Form1"Me.Text = "客户端"Me.StatusStrip1.ResumeLayout(False)Me.StatusStrip1.PerformLayout()Me.ResumeLayout(False)Me.PerformLayout()End SubFriend WithEvents Label1 As belFriend WithEvents Label2 As belFriend WithEvents TextBox1 AsSystem.Windows.Forms.TextBoxFriend WithEvents TextBox2 As System.Windows.Forms.TextBoxFriend WithEvents BtnLink As System.Windows.Forms.ButtonFriend WithEvents BtnSend As System.Windows.Forms.ButtonFriend WithEvents LabService As belFriend WithEvents ListBoxClientContext As System.Windows.Forms.ListBoxFriend WithEvents StartService As System.Windows.Forms.ButtonFriend WithEvents StatusStrip1 As System.Windows.Forms.StatusStripFriend WithEvents ToolStripLable1 As System.Windows.Forms.ToolStripStatusLabelFriend WithEvents ToolStripSeviceStatus As System.Windows.Forms.ToolStripStatusLabelEnd Class2、其次是类,即其控件所对应的方法,在这里注意的是,里面因为需要侦听端口号,所以需要新增一个线程,但是控件是不能跨线程使用的,需要用委托,代码如下:Imports .Sockets'使用到TcpListen类Imports System.IO'使用到StreamWriter类Imports '使用IPAddress类、IPHostEntry类等Imports System.ThreadingPublic Class Form1'Client 端变量定义Private swWriter As StreamWriter'用以向网络基础数据流传送数据Private Client_nsStream As NetworkStream'创建发送数据的网络基础数据流Private tcpClient As .Sockets.TcpClient'通过它实现向远程主机提出TCP连接申请Private tcpConnect As Boolean = False'定义标识符,用以表示TCP连接是否建立'Server端变量定义Private iPort As Integer = 11000'定义侦听端口号Private thThreadRead As Thread'创建线程,用以侦听端口号,接收信息Private tlTcpListen As TcpListener'侦听端口号Private blistener As Boolean = True'设定标示位,判断侦听状态Private Service_nsStream As NetworkStream '创建接收的基本数据流Private srRead As StreamReader'从网络基础数据流中读取数据Private tcClient As TcpClient'用于确认客户端TCP连接请求Private Sub Listen()TrytlTcpListen = New TcpListener(iPort)'以8000端口号来初始化TcpListener实例tlTcpListen.Start()'开始监听Me.ToolStripSeviceStatus.Text = "正在监听..."tcClient = tlTcpListen.AcceptTcpClient()'通过TCP连接请求Service_nsStream = tcClient.GetStream()'获取用以发送、接收数据的网络基础数据流srRead = New StreamReader(Service_nsStream)'以得到的网络基础数据流来初始化StreamReader实例Me.ToolStripSeviceStatus.Text = "已经建立TCP连接!"'循环侦听While blistenerDim sMessage As String = srRead.ReadLine()'从网络基础数据流中读取一行数据If (sMessage = "STOP") Then'Me.StartService.Enabled = TrueMe.StartService.BeginInvoke(New System.EventHandler(AddressOf StartServiceUpdateUI))tlTcpListen.Stop()'关闭侦听Service_nsStream.Close()srRead.Close()'释放资源Me.ToolStripSeviceStatus.Text = "无连接!"bService.BeginInvoke(New System.EventHandler(AddressOf LabServiceUpdateUI))' LabService.Text = "服务尚未启动!"thThreadRead.Abort()'中止线程Me.StartService.Enabled = TrueReturnElseTry'判断是否为断开TCP连接控制码Dim sTime As String = DateTime.Now.ToShortTimeString()'获取接收数据时的时间ListBoxClientContext.BeginInvoke(New System.EventHandler(AddressOf ListBoxUpdateUI), sTime +" " + sMessage)' ListBoxClientContext.Items.Add(sTime + " " + sMessage)Catch ex As ExceptionMessageBox.Show(ex.ToString())End TryEnd IfEnd WhileCatch ex As System.Security.SecurityExceptionMessageBox.Show("侦听失败!", "错误")End TryEnd SubPrivate Sub StartServiceUpdateUI(ByVal sender As System.Object, ByVal e As System.EventArgs)Me.StartService.Enabled = TrueEnd SubPrivate Sub LabServiceUpdateUI(ByVal sender As System.Object, ByVal e As System.EventArgs)bService.Text = "服务尚未启动!"End SubPrivate Sub ListBoxUpdateUI(ByVal sender As System.Object, ByVal e As System.EventArgs)ListBoxClientContext.Items.Add(sender.ToString()) End SubPrivate Sub StartService_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartService.ClickthThreadRead = New Thread(New ThreadStart(AddressOf Listen))'以Listen过程来初始化线程实例thThreadRead.Start()'启动线程StartService.Enabled = FalseLabService.Text = "服务已经启动!"LabService.ForeColor = Color.RedEnd SubPrivate Sub BtnLink_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnLink.ClickDim ipRemote As IPAddress'Dim sHostName As String' Dim tcpClient As TCPClientTryipRemote = IPAddress.Parse(TextBox1.Text) CatchMessageBox.Show("输入的IP地址不合法!", "错误提示!")Return'判断给定的IP地址的合法性End TryTrytcpClient = New Sockets.TcpClient(TextBox1.Text, 11000)'对远程主机的8000端口提出TCP连接申请Client_nsStream = tcpClient.GetStream()'通过申请,并获取传送数据的网络基础数据流swWriter = New StreamWriter(Client_nsStream)'使用获取的网络基础数据流来初始化StreamWriter实例BtnLink.Enabled = FalseBtnSend.Enabled = TruetcpConnect = TrueMe.ToolStripLable1.Text = "已经连接!"CatchMessageBox.Show("无法和远程主机11000端口建立连接!", "错误提示!")ReturnEnd TryEnd SubPrivate Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click If (TextBox2.Text <> "") ThenswWriter.WriteLine(TextBox2.Text)If TextBox2.Text = "STOP" ThenBtnLink.Enabled = TrueswWriter.Flush()'刷新当前数据流中的数据Client_nsStream.Close()swWriter.Close()'清除资源( )Else'刷新当前数据流中的数据swWriter.Flush()End IfTextBox2.Text = ""ElseMessageBox.Show("发送信息不能为空!", "错误提示!") End IfEnd SubEnd Class。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

客户端:#Client.proQT+=core guiQT+=networkgreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTARGET=ClientTEMPLATE=appSOURCES+=main.cpp\mainwindow.cpp\Client.cppHEADERS+=mainwindow.h\Client.hFORMS+=mainwindow.ui//Client.h#ifndef CLIENT_H#define CLIENT_H#include<QAbstractSocket>#include<QTcpSocket>class Client:public QTcpSocket//QAbstractSocket{Q_OBJECTpublic:explicit Client(QObject*parent=0);void sendFile(const QString&file,const QHostAddress&dest);void sendFile(const QString&file,const QString&dest);void sendMsg(const QString text,const QHostAddress&dest);void sendMsg(const QString text,const QString&dest);void sendEOF();signals:void fileSize(qint64size);void message(const QString&str);void onError(qint32);public slots:void on_connected();void displaySocketError(QAbstractSocket::SocketError e);private:QString filePath;QString msg;bool sendfile;bool sendmsg;};#endif//CLIENT_H//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include<QMainWindow>#include<QString>namespace Ui{class MainWindow;}class MainWindow:public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget*parent=0);~MainWindow();private:Ui::MainWindow*ui;int sendBytes;qint64blockNumber;qint64maxBytes;bool cleanQuit;bool sendfile;bool sendmsg;private slots:void on_Sendmsg_clicked();void on_Filerev_clicked();void on_Sendfile_clicked();void setProccessBar(qint64r);void updateProccessBar(qint64v);void on_socketDisconnected();void on_socketError(qint32);};#endif//MAINWINDOW_H//Client.cpp#include"Client.h"#include<QByteArray>#include<QDataStream>#include<QFile>#include<QHostAddress>Client::Client(QObject*parent):QTcpSocket(parent){sendfile=false;sendmsg=false;connect(this,SIGNAL(connected()),this,SLOT(on_connected()));connect(this,SIGNAL(error(QAbstractSocket::SocketError)), this,SLOT(displaySocketError(QAbstractSocket::SocketError)));}void Client::sendFile(const QString&file,const QHostAddress&dest) {filePath=file;sendfile=true;connectToHost(dest,5234);qDebug()<<"Send file"<<file;}void Client::sendFile(const QString&file,const QString&dest){filePath=file;sendfile=true;connectToHost(dest,5234);qDebug()<<"Send file"<<file;}void Client::sendMsg(const QString text,const QHostAddress&dest) {sendmsg=true;msg=text;connectToHost(dest,5234);qDebug()<<"Send message"<<text;}void Client::sendMsg(const QString text,const QString&dest){sendmsg=true;msg=text;connectToHost(dest,5234);qDebug()<<"Send message"<<text;}void Client::on_connected(){qDebug()<<"Connected";if(sendfile){QFile file(filePath);if(!file.open(QIODevice::ReadOnly)){emit onError(2);disconnectFromHost();return;}elseemit fileSize(file.size());emit message(tr("Start send!"));QString fileName=file.fileName();fileName=fileName.remove(0,stIndexOf('/')+1);qint64size;QByteArray block;QDataStream out(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_0);out<<qint16(0x0001)<<fileName.toUtf8();size=block.size();write((char*)&size,sizeof(qint64));write(block.data(),size);//flush();if(!waitForBytesWritten(-1)){qDebug()<<"writen Bytes error"<<errorString();throw2;}do{block.clear();out.device()->seek(0);out<<qint16(0x0002)<<file.read(0xFFF0);size=block.size();qDebug()<<"Send Data"<<size<<"byte.";write((char*)&size,sizeof(qint64));write(block.data(),size);if(!waitForBytesWritten(-1)){qDebug()<<"writen Bytes error"<<errorString();throw2;}}while(!file.atEnd());sendEOF();qDebug()<<"FileSend finished.";emit message(tr("Send finished!"));forever/*(int i=0;i<10;i++)*/{if(!waitForDisconnected()){//sendEOF();}else{//qDebug()<<"Number is"<<i<<".";qDebug()<<"GoTo return.";return;}}qDebug()<<"I will disconnected.";sendfile=false;disconnectFromHost();//have Error.}if(sendmsg){qint64size;QByteArray block;QDataStream out(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_4_0);out<<qint16(0x0004)<<msg.toUtf8();size=block.size();write((char*)&size,sizeof(qint64));write(block.data(),size);sendmsg=false;disconnectFromHost();//have Error.}}void Client::displaySocketError(QAbstractSocket::SocketError e) {qDebug()<<"Error:"<<e<<"\n\t"<<errorString();if(e==QAbstractSocket::HostNotFoundError)emit onError(1);if(e==QAbstractSocket::ConnectionRefusedError)emit onError(3);}void Client::sendEOF(){qint64size;QByteArray block;QDataStream out(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_4_0);QByteArray data=filePath.toUtf8();data.resize(0x8000);out<<quint16(0x0003)<<data<<filePath.toUtf8();size=block.size();write((char*)&size,sizeof(qint64));write(block.data(),size);if(!waitForBytesWritten(-1))qDebug()<<"Send EOF Error:"<<errorString();elseqDebug()<<"Send EOF";}//main.cpp#include"mainwindow.h"#include<QApplication>int main(int argc,char*argv[]){QApplication a(argc,argv);MainWindow w;w.show();return a.exec();}//mainwindow.cpp#include"mainwindow.h"#include"ui_mainwindow.h"#include"Client.h"#include<QFileDialog>#include<QtNetwork/QtNetwork>#include<QMessageBox>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);sendBytes=0;blockNumber=0;maxBytes=0;cleanQuit=true;sendfile=false;sendmsg=false;ui->progressBar->setRange(0,1000);ui->progressBar->setValue(0);}MainWindow::~MainWindow()delete ui;}void MainWindow::setProccessBar(qint64r){maxBytes=r;ui->progressBar->setRange(0,r-1);}void MainWindow::updateProccessBar(qint64v){blockNumber++;sendBytes+=v;ui->progressBar->setValue(sendBytes);}void MainWindow::on_Sendmsg_clicked(){cleanQuit=false;sendmsg=true;if(ui->textEdit->toPlainText()==""){QMessageBox::information(this,tr("Error"),tr("Text can not be empty."));return;}ui->Sendmsg->setEnabled(false);Client*client=new Client(this);connect(client,SIGNAL(disconnected()),client,SLOT(deleteLater()));connect(client,SIGNAL(disconnected()),this,SLOT(on_socketDisconnected()));connect(client,SIGNAL(onError(qint32)),this,SLOT(on_socketError(qint32)));client->sendMsg(ui->textEdit->toPlainText(),ui->serveraddr->toPlainText());}void MainWindow::on_Filerev_clicked(){ui->Filepath->setText(QFileDialog::getOpenFileName(this,tr("Open File"),tr("."),tr("All Files(*)")));void MainWindow::on_Sendfile_clicked(){cleanQuit=false;sendfile=true;sendBytes=0;blockNumber=0;maxBytes=0;if(ui->Filepath->toPlainText()==""||ui->serveraddr->toPlainText()==""){QMessageBox::information(this,tr("Error"),tr("Tag and File can not be empty."));return;}ui->Sendfile->setEnabled(false);Client*client=new Client(this);connect(client,SIGNAL(disconnected()),client,SLOT(deleteLater()));connect(client,SIGNAL(disconnected()),this,SLOT(on_socketDisconnected()));connect(client,SIGNAL(fileSize(qint64)),this,SLOT(setProccessBar(qint64)));connect(client,SIGNAL(bytesWritten(qint64)),this,SLOT(updateProccessBar(qint64)));connect(client,SIGNAL(onError(qint32)),this,SLOT(on_socketError(qint32)));client->sendFile(ui->Filepath->toPlainText(),ui->serveraddr->toPlainText());}void MainWindow::on_socketError(qint32e){switch(e){case1:QMessageBox::warning(this,tr("Error"),QString::fromUtf8("目标名错误!\n"),QMessageBox::Close);break;case2:QMessageBox::warning(this,tr("Error"),QString::fromUtf8("文件名错误!\n"),QMessageBox::Close);break;case3:QMessageBox::warning(this,tr("Error"),QString::fromUtf8("连接目标服务器失败!\n"),QMessageBox::Close);}ui->Sendfile->setEnabled(true);}void MainWindow::on_socketDisconnected(){if(sendfile){ui->progressBar->setRange(0,100);ui->progressBar->setValue(100);ui->Sendfile->setEnabled(true);sendfile=false;}if(sendmsg){ui->Sendmsg->setEnabled(true);sendmsg=false;}cleanQuit=true;}服务器端:#Server.proQT+=networkQT+=widgetsQT+=core guigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTARGET=ServerTEMPLATE=appSOURCES+=main.cpp\mainwindow.cpp\Thread.cpp\Server.cppHEADERS+=mainwindow.h\Thread.h\Server.hFORMS+=mainwindow.ui//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include<QMainWindow>#include<QDateTime>#include"Server.h"namespace Ui{class MainWindow;}class MainWindow:public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget*parent=0);Ui::MainWindow*ui;~MainWindow();private:int sendBytes;qint64blockNumber;qint64maxBytes;bool cleanQuit;bool sendfile;bool sendmsg;private slots:void updateEditText(QString text);void updateProccessBar();};#endif//MAINWINDOW_H//Server.h#ifndef SERVER_H#define SERVER_H#include<QTcpServer>class Server:public QTcpServer{Q_OBJECTpublic:explicit Server(QObject*parent=0);void startServer();void stopServer();protected:void incomingConnection(int handle);signals:void rcvmessage(QString);void filerecv();public slots:void rcvmsg(QString text);void file();void displayError(int);void finished();};#endif//SERVER_H//Thread.h#ifndef THREAD_H#define THREAD_H#include"mainwindow.h"#include"ui_mainwindow.h"#include<QThread>#include<QAbstractSocket>#include<QTcpSocket>#include<QByteArray>#include<QDataStream>#include<QDateTime>#include<QFile>#include<QString>class clientThread:public QThread{Q_OBJECTpublic:explicit clientThread(int h,QObject*parent=0);void proccessData(QByteArray&array);protected:void run();signals:void error(int);void message(QString);void filerecv();public slots:void on_socket_readyRead();void on_socket_disconnected();void displaySocketError(QAbstractSocket::SocketError e);private:QFile file;QString fileName;QString text;QTcpSocket s;qint64blockSize;qint64blockNumber;};#endif//THREAD_H//main.cpp#include"mainwindow.h"#include"Server.h"#include<QApplication>int main(int argc,char*argv[]){QApplication a(argc,argv);MainWindow w;w.show();return a.exec();//mainwindow.cpp#include"mainwindow.h"#include"ui_mainwindow.h"MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->progressBar->setRange(0,100);ui->progressBar->setValue(0);Server*ser=new Server(this);connect(ser,SIGNAL(rcvmessage(QString)),this,SLOT(updateEditText(QString)));connect(ser,SIGNAL(filerecv()),this,SLOT(updateProccessBar()));ser->startServer();}MainWindow::~MainWindow(){delete ui;}void MainWindow::updateProccessBar(){ui->progressBar->setValue(100);}void MainWindow::updateEditText(QString text){QDateTime current_date_time=QDateTime::currentDateTime();QString current_time=current_date_time.toString("yyyy-MM-ddhh:mm:ss ddd");ui->msg->append(current_time);ui->msg->append(text);}//Server.cpp#include"Server.h"#include"Thread.h"Server::Server(QObject*parent):QTcpServer(parent){}void Server::startServer(){listen(QHostAddress::Any,5234);qDebug()<<"Server started on port0.0.0.0:5234";}void Server::stopServer(){close();}void Server::incomingConnection(int handle){clientThread*client=new clientThread(handle,this);connect(client,SIGNAL(error(int)),this,SLOT(displayError(int)));connect(client,SIGNAL(finished()),this,SLOT(finished()));connect(client,SIGNAL(finished()),client,SLOT(deleteLater()));connect(client,SIGNAL(message(QString)),this,SLOT(rcvmsg(QString)));connect(client,SIGNAL(filerecv()),this,SLOT(file()));client->start();}void Server::rcvmsg(QString text){emit rcvmessage(text);}void Server::file(){emit filerecv();}void Server::displayError(int e){qDebug()<<"The clientThread have a error."<<e<<".";}void Server::finished()qDebug()<<"a clientThread finished.";}//Thread.cpp#include"Thread.h"#include<QAbstractSocket>#include<QByteArray>#include<QDataStream>#include<QDateTime>#include<QFile>#include<QHostAddress>#include<QString>clientThread::clientThread(int h,QObject*parent):QThread(parent),s(parent)/*s(QAbstractSocket::TcpSocket,parent)*//*,file(parent)*/{blockSize=0;blockNumber=0;s.setSocketDescriptor(h);connect(&s,SIGNAL(disconnected()),this,SLOT(on_socket_disconnected()));connect(&s,SIGNAL(readyRead()),this,SLOT(on_socket_readyRead()));connect(&s,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displaySocketError(QAbstractSocket::SocketError)));}void clientThread::proccessData(QByteArray&array){QDataStream in(&array,QIODevice::ReadOnly);in.setVersion(QDataStream::Qt_4_0);quint16key;QByteArray data;in>>key>>data;blockNumber++;qDebug()<<"BlockNumber"<<blockNumber<<",size:"<<blockSize+sizeof(qint64)<<".";qDebug()<<"\tKey:"<<key<<"\t\tSize:"<<data.size()<<".";switch(key){case0x0001://file namefileName=fileName.fromUtf8(data.data(),data.size());file.setFileName(fileName);if(file.exists(fileName)){qDebug()<<"File was exists.now remove it!";file.remove(fileName);}if(!file.open(QIODevice::WriteOnly)){qDebug()<<"Can not open file"<<file.fileName()<<".";throw2;}break;case0x0002://file datafile.write(data.data(),data.size());file.flush();break;case0x0003://file EOFqDebug()<<"File transt finished.";file.close();emit filerecv();s.disconnectFromHost();break;//emit finished();case0x0004:qDebug()<<"Receive message";text=text.fromUtf8(data.data());emit message(text);qDebug()<<text;break;default:;}}void clientThread::run(){qDebug()<<"New connect from"<<s.peerAddress().toString()<<":" <<s.peerPort()<<".";exec();}void clientThread::on_socket_disconnected(){qDebug()<<"socket disconnected.";exit();//emit finished();}void clientThread::on_socket_readyRead(){while(s.bytesAvailable()>=sizeof(quint64)){if(blockSize==0){if(s.bytesAvailable()<sizeof(qint64))return;s.read((char*)&blockSize,sizeof(qint64));//read blockSize }if(s.bytesAvailable()<blockSize)//have no enugh datareturn;QByteArray data=s.read(blockSize);proccessData(data);blockSize=0;}}void clientThread::displaySocketError(QAbstractSocket::SocketError e) {qDebug()<<"Error:socket have error"<<e<<"\n\t"<<s.errorString() <<".";qDebug()<<"Removed"<<file.fileName()<<".";if(file.isOpen())file.close();elsereturn;if(!file.fileName().isEmpty())file.remove(fileName);elsereturn;emit error(2);//exit();}。

相关文档
最新文档