Qt TCP服务端和客户端连接

前言

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

如需了解UDP与TCP对比,可点击了解UDP和TCP对比
下面简单介绍下TCP用法。

首先需要在.pro文件中加入

QT       +=network

头文件

#include <QTcpServer>
#include <QTcpSocket>

服务端

  • 首先
	m_server = new QTcpServer();
	m_server->listen(QHostAddress::Any, 8888);
	//监听客户端连接
	connect(m_server, SIGNAL(newConnection()), SLOT(onNewConnection()));
  • 获取客户端连接
void Widget::onNewConnection()
{
	m_socket = m_server->nextPendingConnection();  //获取连接套接字'
	//断开连接
	connect(m_socket, SIGNAL(disconnected()), SLOT(onDisconnected()));
	//接收消息
	connect(m_socket, SIGNAL(readyRead()), SLOT(onReadyRead()));
}
  • 读取客户端消息
void Widget::onReadyRead()
{
	//可读取多个客户端消息
    QTcpSocket *obj = (QTcpSocket*)sender();
	obj->readAll();
}
  • 客户端断开连接
void Widget::onDisconnected()
{
	sender()->deleteLater();  //获取断开连接的socket对象并销毁
	qDebug() << "client disconnected!!";
}

客户端

  • 首先
	m_clientSocket = new QTcpSocket();
	
	//连接服务器成功
	connect(m_clientSocket, SIGNAL(connected()), SLOT(onConnected()));
	//读取消息
	connect(m_clientSocket, SIGNAL(readyRead()), SLOT(onReadyRead()));
	//断开连接
	connect(m_clientSocket, SIGNAL(disconnected()), SLOT(onDisconnected()));
	
	//连接到 m_ip
	m_clientSocket->connectToHost(QHostAddress(m_ip), 8888);
  • 连接服务器成功
void Widget::onConnected()
{
	qDebug() << "connected!!";
}
  • 读取消息
void Widget::onReadyRead()
{
	m_clientSocket->readAll()}
  • 断开连接
void Widget::onDisconnected()
{
	sender()->deleteLater();  //获取断开连接的socket对象并销毁
    qDebug() << "disconnected!!";
}
  • 发送消息
    m_clientSocket->write(ui->textEdit_Send->toPlainText().toLatin1());

获取客户端ip地址

void Widget::onReadyRead()
{
	QTcpSocket *obj = (QTcpSocket*)sender();
	QString ip = obj->peerAddress().toString();
}

本机ip地址

    QString ip;
    QList<QHostAddress> AddressList = QNetworkInterface::allAddresses();
    foreach(QHostAddress address, AddressList){
        if(address.protocol() == QAbstractSocket::IPv4Protocol &&
                address != QHostAddress::Null &&
                address != QHostAddress::LocalHost){
            if (address.toString().contains("127.0.")){
                continue;
            }
            ip = address.toString();
            break;
        }
    }
    qDebug()<<"m_myIp:"<<ip;

版权声明:本文为kchmmd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。