Qt 中Socket程式設計例項

wjs1033發表於2014-02-25

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

相關文章