这里主要说的是TCP通信
服务器简略设计
客户端和客户端之间是不能直接交互的,这也是服务器存在的意义.
响应和接收信息时都是异步通信的方式,产生相应信号
创建服务器连接
使用QTcpServer(QT中创建TCP服务器的类)创建服务器
设置监听服务器ip地址和端口
响应客户端连接
获取客户端通信的TCP套接字
保存客户端通信套接字
实时接收客户端发送的消息
接收客户端发送的信息
检查客户端是否有消息
有消息则读取 保存 显示
将消息发给所有在线的客户端
客户端简略设计
创建通信套接字
使用QTcpSocket创建套接字
和服务器建立连接
通过配置服务器ip和端口想服务器发送请求
连接成功,发送进入聊天提示信息
发送,接收聊天信息
输入聊天信息,发送到服务器
实时接收服务器发送的信息,并显示
TCP协议简介
TCP(传输控制协议),是一个可靠的,基于字节流的,面向连接的传输层协议.
在OSI定义的七层网络模型中,TCP属于第四层传输层所指定的功能,
在TCP/IP协议族中,位于IP层之上,应用层之下的中间层.
主机应用层之间经常需要可靠的,像管道一样的连接,但IP层不提供这样的流机制.
TCP协议符合这一要求,特别适合连续传输数据,同时能保证数据的安全性.
HTTP协议就是基于TCP协议实现的.
QTcpServer类简介
提供了TCP服务器,可以快速的建立TCP服务器,平且可以实时的响应客户端的连接请求.
QTcpServer::listen()可以指定服务器端口号(端口号0-65535,但是0-1024一般是系统使用的),没有指定QTcpServer会自动选择一个可用的端口号,该函数还会监听当前主机指定的IP地址(QHostAddress)(服务器主机上可能有多块网卡,例如笔记本上可以通过有线,无线连接(就好像手机可以双卡双待一样,设置一个IP就相当于设置一个电话号)),通常设置成QHostAddress::Any(对应0.0.0.0)这个地址可以监听所有地址.
设置监听后,每当检测到客户端发来的连接请求,都会发送信号newConnection(),可以自定义槽函数,调用nextPandingConnection()获取和客户端通信的套接字.
QTcpServer,创建TCP服务器
创建QTcpServer对象
QTcpServer tcp_server;
开启TCP服务器,监听所有地址,端口号
tcp_server.listen(QHostAddress::Any,port);
客户端向服务器发送连接请求时,发送的信号处理槽函数
connect(&tcpserver,SLGNAL(newConnection()),this,SLOT(answerConnection()自定义槽函数));
void answerConnection()
{
//获取和客户端通信的套接字
QTcpServer* client_socket = tcp_server.nextPendingConnection();
//保存客户端套接字
client_list.append(client_socket);
//客户端向服务器发送消息时,触发readyread信号
connect(client_socket,SIGNAL,(readyread()),this,SLOT(answerReadyread()));
}
接收客户端发来的信息
void answerReadyread()
{
//遍历检查哪个客户端有消息
for(int i = 0;i < client_list.size();i++)
{
//获取等待套接字字节数,没有消息返回0
if(client_list.at[i]->bytesAvailable())
{
QByteArray buf = client_list.at(i)->readALL();//读取保存到buf
ui->listWidget->addItem(buf);//显示到界面
sendMessage(buf);//发送给其他客户端
}
}
}