[QT]局域网内的TCP模型

1 篇文章 0 订阅

使用QT提供的QTcpServer和QTcpSocket两个类来进行局域网内的通信

每台机器同时既是服务端,也是客户端

服务端口长期开放,用作接受数据

客户端口在需要时连接其他机器的服务端口,用作发送数据


    /** 初始化服务端 */
    tcpServer = new QTcpServer(this);
    tcpServer->listen(QHostAddress::Any, TRANS_PORT);
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(acceptNew()));
    /** 首先建立一个QTcpServer,然后利用这个套接字监听所有网段的指定端口,当有新的连接到来,
        会有newConnection消息激活acceptNew槽 */
/** 当一个新的连接到来的处理 */
void Net::acceptNew()
{
    clienSocket = tcpServer->nextPendingConnection();
    connect(clienSocket, SIGNAL(readyRead()), this, SLOT(NetGetFile()));
    connect(clienSocket, SIGNAL(disconnected()), this, SLOT(disconnt()));
}
/** 使用一个clienSocket来获得连接到的套接字,接下来就利用这个套接字进行通信*/
/** 当有数据到达,需要读取时,会有readyRead消息激活槽进行处理 */
在自定义的槽函数中,就可以用QTcpSocket类的方法进行数据的发收了

/** 连接到服务主机,以便向主机传送文件 */
void Net::conntToServer(QHostAddress serverIP)
{
    QTcpSocket *sendSocket = new QTcpSocket(this);
    sendSocket->connectToHost(serverIP, TRANS_PORT);
    connect(sendSocket, SIGNAL(connected()), this, SLOT(NetSendFile()));
}
/** 利用connectToHost来连接到指定的服务端,当连接成功,会有connected消息,在槽中即可以进行数据的发收了*/

挖坑:
服务器怎样同时接受多个连接,客户端怎样同时接连多个服务器,挖坑待填。。。


(2012-07-02)追加:

在之前的实现中,客户端和服务端都无法在链接多个目标后正常通信,为了解决这一问题,决定在实现时,采用线程技术,即每一个链接都有一个新的线程,各个链接之间互不干扰。

具体实现方法为:

服务端:

监听newConnection信号,当一个新链接到来时

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(acceptNew()));

/** 当一个新的连接到来的处理 */
void Net::acceptNew()
{
    QTcpSocket *clienSocket = tcpServer->nextPendingConnection();
    NetGet(clienSocket);
}

/** 新建文件接受线程 */
void Net::NetGet(QTcpSocket *clienSocket)
{
    GetPthread *getPthread = new GetPthread(clienSocket, this);
    getPthread->start();
}

/**在线程中的处理为链接readyRead后,等待信号到来,做读取数据操作 */
connect(getSocket, SIGNAL(readyRead()), this, SLOT(getData()));

客户端:

/** 连接到服务主机,以便向主机传送数据 */
void Net::conntToServer(QHostAddress serverIP)
{
    QTcpSocket *sendSocket = new QTcpSocket();
    sendSocket->connectToHost(serverIP, TRANS_PORT);
    NetSend(sendSocket);
}

/** 新建文件发送线程 */
void Net::NetSend(QTcpSocket *sendSocket)
{
    char *filePath = "testfile.jpg";
    SendFilePthread *sendPthread = new SendFilePthread(sendSocket, filePath, this);
    sendPthread->start();
}

/** 线程中的处理 */
/** 链接connected信号,链接成功之后将文件信息发送过去 */
connect(m_sendSocket, SIGNAL(connected()), this, SLOT(sendFileInfo()));
/** 链接bytesWritten信号和文件发送槽,每次发送成功继续发送 */
connect(m_sendSocket, SIGNAL(bytesWritten(qint64)), this, SLOT(readFileSend(qint64)));

这样即可实现在需要新的链接时,各用一个新的线程来处理,方便并且不会阻塞主线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值