Qt 中Socket编程实例

Qt 中Socket编程实例


本文章所讲述的内容是关于Qt中Socket编程,对于socket,大家并不陌生,应用程序调用socket函数来创建一个能够进行网络通信的套接字。


SOCKET socket( int af, int type, int protocol ); 应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET; 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部);第三个参数指定应用程序所使用的通信协议。

在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口。但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误。QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。而且它采用QT本身的signal-slot机制,使编写的程序更容易理解。

QT中共提供四个与套按字相关的类,分别是:

   
   
  1. QServerSocket:TCP-based server  
  2. QSocket:   Buffered TCP connection  
  3. QSocketDevice:  Platform-independent low-level socket API  
  4. QSocketNotifier: Support for socket callbacks 

下面介绍使用QT进行网络编程,我们使用一个简单的C/S模式网络程序说明如何使用QT中的套接字。同时我们用TCP和UDP两种协议实现这个程序(该程序客户端与服务端各向对方发送一个字符口串“abc”)

1、UDP实现

UDP是不连接协议,没有客户端与服务端的概念。

(1)建立套接字相关对象

   
   
  1. QSocketDevice *MUReceiveSocket;   //套接字对象  
  2. QSocketNotifier *MSocketNotifier;     //套接字监听对象 

(2)初始化套接字相关对象

   
   
  1. MUReceiveSocket=new QSocketDevice(QSocketDevice::Datagram);    
  2. //UDP初始化  
  3. QHostAddress MyAddress;  
  4. QString FakeAddress;  
  5. FakeAddress = get_eth1_ip();  //取得接口IP  
  6. MyAddress.setAddress(FakeAddress);  
  7. MUReceiveSocket->bind(MyAddress,Port);    
  8. //绑定到指定网络接口地址(IP),指定逻辑端口  
  9. MSocketNotifier = new QSocketNotifier(MUReceiveSocket->socket(),QSocketNotifier::Read,0,"MSocketNotifier");  
  10. //监听MUReceiveSocket套接字 

(3)定义用实现响应slot

   
   
  1. virtual void OnMReceive();  
  2. void Client::OnMReceive(){  
  3. int ByteCount,ReadCount;  
  4. char *IncommingChar;  
  5. fprintf(stderr,"Load a piece of Message!\n");  
  6. ByteCount=MUReceiveSocket->bytesAvailable();  
  7. IncommingChar=(char *)malloc(ByteCount+1);  
  8. ReadCount=MUReceiveSocket->readBlock(IncommingChar,ByteCount);  
  9. IncommingChar[ByteCount]='\0';  
  10. fprintf(stderr,“%s“,IncommingChar);  //打印接收的字符串  
  11.            } 

(4)关联套接字的signal和接收slot

   
   
  1. connect(MSocketNotifier,SIGNAL(activated(int)),this,SLOT(OnMReceive()));  
  2. //当MSocketNotifier检测到MUReceiveSocket活跃时调用OnMReceive 

(5)发送字符串

   
   
  1. char information[20];  
  2. strcpy(information,“abc“);  
  3. MUReceiveSocket->writeBlock(information,length,MyAddress,2201);  

2、TCP实现

TCP的实现与UDP的实现大同小异,它是面象连接的协议。这里只介绍与UDP不同的地方。

服务端:

(1)套接字对象的定义

比UDP多定义一个套接字,一个用来监听端口,一个用来通信。
建立一个QSSocket类继承QServerSocket

   
   
  1. QSSocket *ServerSocket;    //TCP-based server  
  2. QSocketDevice *ClientSocket;  
  3. QSocketNotifier *ClientNotifier;  
  4. QSocketNotifier *ServerNotifier; 

(2)套接字的初始化

   
   
  1. QHostAddress MyAddress;  
  2. QString FakeAddress;  
  3. FakeAddress = "127.0.0.1";  
  4. MyAddress.setAddress(FakeAddress);  
  5. UINT Port=1234;  
  6. ServerSocket=new QSSocket(MyAddress,Port,this,0);   //指定监听地址及端口  
  7. //这里也可以使用QServerSocket类  
  8.  ClientSocket=new QSocketDevice(QSocketDevice::Stream);  
  9. ClienttNotifier = new QSocketNotifier(ClientSocket->socket(),QSocketNotifier::Read,0,"ClientSocket"); 

(3)响应连接

只需要在QSSocket的构造函数里添加如下代码:

   
   
  1. ServerSocket->newConncetion(ClientSocket->socket()); 

当收到客户端的连接后,ClientSocket自动响应,并接收数据。

(4)接收信息slot与UDP一致,这里不在叙述。

客户端实现:

客户端的实现与UDP实现大同小异,不同的地方只是客户端套接字不需要bind端口,因为连接上服务端后TCP会保持这个连接,直到通信的结束。

小结:对于本篇文章实现Qt 中Socket编程,讲解到这,客户端和服务端的实现很important!实现套接字的网络通信。希望本文对你有帮助!!!

http://mobile.51cto.com/symbian-268461.htm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT进行socket编程可以使用QT的网络模块,其包含了QTcpSocketQTcpServer类来实现TCP的客户端和服务器端的通信。 要使用QTcpSocket实现TCP客户端,你需要先创建一个QTcpSocket对象,并使用connectToHost方法连接到服务器。然后,使用write方法发送数据,使用read方法接收数据。同时,你可以通过connected信号和disconnected信号来处理连接状态的变化。 这是一个简单的QTcpSocket客户端的示例代码: ```cpp QTcpSocket* socket = new QTcpSocket(); socket->connectToHost("127.0.0.1", 1234); // 连接到服务器 QObject::connect(socket, &QTcpSocket::connected, [](){ qDebug() << "Connected to server"; }); QObject::connect(socket, &QTcpSocket::disconnected, [](){ qDebug() << "Disconnected from server"; }); QObject::connect(socket, &QTcpSocket::readyRead, [socket](){ QByteArray data = socket->readAll(); qDebug() << "Received data:" << data; }); socket->write("Hello Server"); // 发送数据 ``` 要使用QTcpServer实现TCP服务器,你需要先创建一个QTcpServer对象,并使用listen方法监听指定的端口。然后,使用newConnection信号来处理新的连接请求。当有新的连接请求时,你可以通过nextPendingConnection方法获得一个QTcpSocket对象,通过该对象与客户端进行通信。 这是一个简单的QTcpServer服务器的示例代码: ```cpp QTcpServer* server = new QTcpServer(); server->listen(QHostAddress::Any, 1234); // 监听指定的端口 QObject::connect(server, &QTcpServer::newConnection, [server](){ QTcpSocket* socket = server->nextPendingConnection(); // 获取连接的socket qDebug() << "New client connected"; QObject::connect(socket, &QTcpSocket::disconnected, [socket](){ qDebug() << "Client disconnected"; socket->deleteLater(); }); QObject::connect(socket, &QTcpSocket::readyRead, [socket](){ QByteArray data = socket->readAll(); qDebug() << "Received data:" << data; socket->write("Hello Client"); // 发送数据给客户端 }); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值