Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46961
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-11 09:11
文章分类

全部博文(40)

文章存档

2020年(1)

2017年(36)

2014年(3)

我的朋友

分类: C/C++

2017-03-17 14:29:08

LoongServer.zip
TCP是一个基于“流”的协议
QT中建立基于TCP的连接主要是通过QTcpSocket和QTcpServer两个类实现的

一、QTcpSocket
     1.当成功建立连接时发出信号connected()
     2.当有可读数据时发出信号readyRead()
     3.当连接被终端时发出信号disconnected()

二、客户端
     1.在客户端首先定义套接字
     QTcpSocket client_tcpsocket;
     2.建立三个常用信号与槽函数的连接并实现槽函数
    connect(&client_tcpsocket,SIGNAL(connected()),this,SLOT(slot_sendRequest())); 
    connect(&client_tcpsocket,SIGNAL(readyRead()),this,SLOT(slot_getResult()));      connect(&client_tcpsocket,SIGNAL(disconnected()),this,SLOT(slot_connectionClosedByServer())); 
     3.然后尝试连接server,如果server端正在监听则会立即连接成功
    client_tcpsocket.connectToHost(QHostAddress::LocalHost,3679);
三、服务端
     1.一般是重新实现QTcpServer类
     class ManageServer : public QTcpServer
     2.建立信号与槽函数的连接并实现槽函数
     connect(&server_tcpsocket,SIGNAL(readyRead()),this,SLOT(slot_recive()));
     connect(&server_tcpsocket,SIGNAL(disconnected()),this,SLOT(deleteLater()));
     3.然后定义QTcpServer并监听端口
    ManageServer myServer; 
    if(!myServer.listen(QHostAddress::Any,3679)) 
    { 
        qDebug() << "Faile to bind to port"; 
        return 1; 
    }else      {  
        qDebug() << "Listening port 3679";      } 


四、一般先运行服务端,然后再运行客户端,这样便可成功建立连接
1.发送数据
void Thread_client::slot_sendRequest() 
{ 
 QByteArray block; 
 QDataStream out(&block,QIODevice::WriteOnly); 
 out.setVersion(QDataStream::Qt_4_8); 
 
 out << quint16(0) 
 << client_UserName 
 << client_PassWord; 
 out.device()->seek(0); 
 quint16 data_size = quint16(block.size() - sizeof(quint16)); 
 out << data_size; 
 
 client_tcpsocket.write(block); 
}
2.接收数据
void ManageServer::slot_recive()
{
 QDataStream in(&server_tcpsocket);
 in.setVersion(QDataStream::Qt_4_8);
 if(get_blocksize == 0)
 {
 if(server_tcpsocket.bytesAvailable() < sizeof(quint16))
 return;
 in >> get_blocksize;
 }
 if(server_tcpsocket.bytesAvailable() < get_blocksize)
 return;
 in >> userName;
 in >> passWord;
}
数据便已经存储在userName和passWord中了 
 
五、结果
1.运行服务端

2.运行客户端

3.服务端连接成功后

阅读(149) | 评论(0) | 转发(0) |
0

上一篇:QT资源文件

下一篇:信号和槽

给主人留下些什么吧!~~