zoukankan      html  css  js  c++  java
  • Qt网络编程

    Qt提供了Socket的支持,它采用API形式的封装,使得程序员不需要接触底层的代码就可以对socket进行操作。

    1.UDP的实现

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

    1)建立套接字相关对象

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

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

     1 MUReceiveSocket = new QSocketDevice(QSocketDevice::Datagram);
     2 
     3 //UDP初始化
     4 
     5       QHostAddress MyAddress;
     6 
     7       QString FakeAddress;
     8 
     9       FakeAddress = get_eth1_ip();
    10 
    11 //取得接口IP
    12 
    13       MyAddress。setAddress(FakeAddress);
    14 
    15       MUReceiveSocket->bind(MyAddress,port);
    16 
    17 //绑定到指定网络接口地址(IP),指定逻辑端口
    18 
    19 MSocketNotifier = new QSocketNotifier(MUReceiveSocket->socket(),QSocketNotifier::Read,0,"MSocketNotifier");
    20 
    21 //监听MUReceiveSocket套接字
    22 
    23  

    3)定义实现响应slot

     1 virtual void OnMReceive();
     2 
     3 void Client::OnMReceive()
     4 
     5 {
     6 
     7   int ByteCount,ReadCount;
     8 
     9   char *IncomingChar;
    10 
    11   fprintf(stderr,"Load a piece of Message!
    ");
    12 
    13   ByteCount = MUReceiveSocket->bytesAvailable();
    14 
    15   InconingChar = (char *)malloc(ByteCount + 1);
    16 
    17   ReadCount = MUReceiveSocket->readBlock(IncomingChar,ByteCount);
    18 
    19   IncomingChar[ByteCount] = '';
    20 
    21   fprintf(stderr,"%s",IncomingChar);
    22 
    23 }
    24 
    25  

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

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

    5)发送字符串

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

    2.TCP的实现

    TCP的实现与UDP的实现大同小异,它是面向连接的协议。

    1)服务端

    1>套接字对象的定义

    1 QSSocket *ServerSocket;
    2 
    3 QSocketDevice *ClientSocket;
    4 
    5 QSocketNotifier *ClientNotifier;
    6 
    7 QSocketNotifier *ServerNotifier;

    2>套接字的初始化

     1 QHostAddress MyAddress;
     2 
     3 QString FakeAddress;
     4 
     5 FakeAddress = "127.0.0.1";
     6 
     7 MyAddress。setAddress(FakeAddress);
     8 
     9 UINT Port = 1234;
    10 
    11 ServerSocket = new QSSocket(MyAddress,Port,this,0);
    12 
    13 //指定监听地址及端口
    14 
    15 ClientSocket = new QSocketDevice(QSocketDevice::Stream);
    16 
    17 ClientNotifier = new QSocketNotifier(ClientSocket->socket(),QSocketNotifier::Read,0,"ClientSocket");

    3>响应连接

    1 只需要在QSSocket的构造函数里添加如下代码。
    2 
    3 Server Socket->new Connection(ClientSocket->socket());
    4 
    5 当受到客户端的连接后,ClientSocket会自动响应,并接收连接。

    4>接收信息slot与UDP是一样的

    2)客户端的实现

    1 客户端的实现与UDP实现不同之处是客户端套接字不需要bind端口,因为连接上服务器端后TCP会保持这个连接,直到通信结束。

    获取途径书籍

  • 相关阅读:
    svn 提交失败 更新失败 提示 已经锁定
    Jquery 弹出提示框输入插件 apprise 修改中文按钮以及使用说明
    英文 数字 不换行 撑破div容器
    .clear 万能清除浮动
    Repeater 控件 当数据源没有数据的时候显示 暂无数据 的两种方式
    已以用户 NT AUTHORITYSYSTEM 的身份执行。 对象 名称 'XXX' 包含的前缀超出了最大限值。最多只能有 2 个。
    EasyUI的onLoadSuccess方法
    安装完office后 在组件服务里DCOM配置中找不到
    怎么看SQL表里某列是否是自增列
    SQL连接服务器链接失败
  • 原文地址:https://www.cnblogs.com/wanzaiyimeng/p/3294576.html
Copyright © 2011-2022 走看看