14 QT TCP网络编程与网络聊天室的实现

网络设备:用于远程的计算机间的通信.

每个网络设备都有一个ip地址. ip地址用于区分一个局域网内不同的计算机, ip地址在同一个局域网内不可以重复使用(如重复使用会两个都连不了网), ip地址可由路由器动态分配,也可以手动指定.

网络掩码用于指定所属的局域网的ip地址范围。 “255.255.255.0”就是表示最高的24位为1(xxx.xxx.xxx.0 ~ xxx.xxx.xxx.255). “255”就是0xff, 8位都为1.

端口号. 在同一个计算机系统里所有的进程都是共用一个网卡进行网络访问, 进程的数据就由不同的端口号来区分的(端口号从0~65535). 一个端口号只能给一个进程使用,但一个进程可以使用多个端口号.

/
tcp是网络通信协议之一.

它是可靠的(不容易丢数据),顺序的(接收时收到的数据顺序也是按发出的数据顺序来的),基于连接的网络通信协议.

基于连接: tcp编程通过分成服务器端与客户端, 服务器端(网站)和客户端(个人pc).
在服务器端,每个客户端的通信都要有一个专用通信, 而且客户端只能与服务器端通信,不能直接与其它客户端通信。
   如要实现客户端间的通信, 需要由服务器端来转发.
  



在QT里, tcp编程需用到两个类: QTcpServer, QTcpSocket

服务器端:

    //1.  创建一个QTcpServer对象
        QTcpServer *server = new QTcpServer;

    //2. 调用对象的listen函数成员进行绑定地址与端口号, 并监听端口
        server->listen(QHostAddress::Any, 9999); // 绑定端口号9999, 成功返回true, 失败返回false

    // 3.  连接对象的newConnection信号到一个槽函数,用于处理客户端的连接。
            connect(server, SIGNAL(newConnection()), this, SLOT(new_client()));  //当有客户端连接时,对象会发出newConnection信号,客户端的连接处理就在触发的槽函数new_client里处理了。

    // 4. 在处理客户端连接的槽函数new_client里处理连接. 每个客户端连接上来后,在服务器端就会有一个QTcpSocket对象对一个客户端通信使用,如多个客户端连接上来,则会有多个QTcpSocket对象.
    QTcpSocket *client;

    client = server->nextPendingConnection(); //处理客户端连接, 调用此处理函数后,会得到一个QTcpSocket对象的地址,此对象专用于这个连接上来的客户端通信使用。

    // QTcpSocket对象在服务器端用于与客户端通信使用,当客户端发数据到服务器端时,它会发出信号readyRead, 通知接收客户端的数据. 当客户端断开连接时,会发出disconnected信号,通知客户端已断线.发送数据则调用对象的write函数即可.

    //连接信号,做相应的处理
    connect(client, SIGNAL(readyRead()), this, SLOT(tcp_read()));  // tcp_read槽函数用于接收客户端的数据, 在槽函数里调用QTcpSocket对象的read函数即可.

   connect(client, SIGNAL(disconnected()), this, SLOT(lost_client()));  // lost_client槽函数用于处理客户端断开连接

客户端:

    // 1. 创建QTcpSocket对象
       QTcpSocket *tcp = new QtcpSocket;

    // 2. 连接服务器端的IP地址与端口号, 连接成功会发出connected信号。也可以直接调用waitForConnected等待连接的结果。 
    tcp->connectToHost("192.168.250.250", 9999);

    // 3. 调用对象的read/write函数即可与服务器端进行收发数据了。当服务器端有发数据过来时,会发出readyRead信号,在连接此信号的槽函数里接收数据即可.

网络聊天室的技术要点:

因在服务器端每个客户端连接,都会产生一个QTcpSocket对象用于与对应的客户端通信。而客户端个数是不确定的,所以可以用QList<QTcpSocket *>的链表存放每个对象的地址。

群发的实现:
接收到客户端发过来的内容后,遍历链表,给每个客户端发送同一份内容即可。

完整工程源码下载:
http://download.csdn.net/detail/jklinux/9842208

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值