一. C语言中
1. 服务器端流程Server
1. 创建套接字--socket()
2.将套接字与其ip地址,端口号进行绑定--bind()
3. 将套接字设置成被动监听状态--listen()
2和3是Qt中的listen(),1,2和3实质就是把自己的信息固定下来,等待别人与之通信
4. 阻塞等待客户端的连接请求--accept()
5. 进行通信 1)recv(),read()接收数据 send() write()发送数据
6. 关闭套接字--close()
2. 客户端流程Client
1. 创建套接字--socket()
绑定ip及端口号(可选),此步可以随机让系统产生.
2. 发送客户端的连接请求--connect()
3, 进行通信 recv() read() 接收数据
send() write() 发送数据
4. 关闭套接字--close()
二. Qt中
1. 服务器端流程Server
-
创建套接字服务器 QTcpServer 对象
-
通过 QTcpServer 对象设置监听,即:QTcpServer::listen()
-
基于 qTcpserver::newconnection()信号检测是否有新的客户端连接
-
如果有新的客户端连接调用 QTcpSocket *QTcpserver::nextPendingconnection()得到通信的套接字对象
-
使用通信的套接字对象 QTcpSocket和客户端进行通信
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); this->setWindowTitle("服务器"); server = new QTcpServer(this); connect(server,&QTcpServer::newConnection,[=](){ socket = server->nextPendingConnection(); ui->checkroomTex->append("与客户建立了联接..."); connect(socket,&QTcpSocket::readyRead,[=](){ QString recMeg = socket->readAll(); ui->checkroomTex->append("客户端输出:"+recMeg); }); connect(socket,&QTcpSocket::disconnected,[=](){ ui->checkroomTex->append("客户端断开了连接"); socket->deleteLater(); }); }); } Widget::~Widget() { delete ui; } void Widget::on_startBtn_clicked() { int port = ui->port->text().toInt(); server->listen(QHostAddress::Any,port); ui->startBtn->setEnabled(false); } void Widget::on_senderBtn_clicked() { QString sendMsg = ui->senderTex->toPlainText(); socket->write(sendMsg.toUtf8()); ui->checkroomTex->append("服务器端输出:"+sendMsg); ui->senderTex->clear(); }
2. 客户端流程Client
1)创建通信的套接字类QTcpSocket对象
2)使用服务器端绑定的IP和端口连接服务器QAbstractSocket::connectToHost()
3)使用QTcpSocket对象和服务器进行通信
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("客户端");
//建立套接字
socket = new QTcpSocket(this);
//确认是否已经连接成功
connect(socket,&QTcpSocket::connected,[=](){
ui->checkroomTex->append("与服务器连接成功");
});
connect(socket,&QTcpSocket::readyRead,[=](){
QString recMsg = socket->readAll();
ui->checkroomTex->append("服务器输出"+recMsg);
});
connect(socket,&QTcpSocket::disconnected,[=](){
ui->checkroomTex->append("服务器断开了");
ui->linkserverBtn->setEnabled(true);
ui->disconnectBtn->setEnabled(false);
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_linkserverBtn_clicked()
{
QString ip = ui->address->text();
unsigned int port = ui->port->text().toUInt();
socket->connectToHost(QHostAddress(ip),port);
ui->linkserverBtn->setEnabled(false);
ui->disconnectBtn->setEnabled(true);
}
void Widget::on_senderBtn_clicked()
{
QString sendMsg = ui->senderTex->toPlainText();
socket->write(sendMsg.toUtf8());
ui->checkroomTex->append("客户端输出"+sendMsg);
ui->senderTex->clear();
}
void Widget::on_disconnectBtn_clicked()
{
socket->close();
ui->linkserverBtn->setEnabled(true);
ui->disconnectBtn->setEnabled(false);
}