使用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)));
这样即可实现在需要新的链接时,各用一个新的线程来处理,方便并且不会阻塞主线程