Qt学习心得之网络编程简单的局域网聊天服务端建立

学而不思则罔,思而不学则殆。学习和思考是相辅相成的,通过这几天对网络编程的学习,收获颇丰。接下来我将利用Qt做的一个以TcpIp协议为传输方式的简单的局域网聊天服务端与大家分享下:

首先谈谈我个人对Tcp协议的理解:Tcp就是网上购物,买家和买家之间的物品传递,快递公司的扮演。快递公司将卖家所要寄出的物品进行包装,给予独特的号码,并从卖家获取目的地地址,得知这些明确信息后准确将物品送到买家,买家签收后,卖家通过快递单号查询到买家签收的消息。

其次是这个简单局域网聊天服务器的创建思路。如下图是思路的框图:

一个服务器的建立,必须要有对外双向通讯的接口就是套接字(socket),所以需要建一个Mysocket的类,这样才可以将不同客户端的消息发给其他客户端。之后还需要再创建一个Myserver的类,将每个客户端发送的消息通过Mysocket发送信号被接受。然后在每个客户端对应的每个Myserver中将各自发送的信号发送给其他客户端,并再发送给server在UI界面上显示。如图:在Mysocket和Myserver以及Myserver和server之间的联系都是通过发送信号,并利用槽函数进行处理,所以这整个程序的关键是合理运用信号和槽函数,将信息顺利传达。

然后是程序的展示和一些关键点的处理方式。

//========================Mysocket.c=============================//

MyTcpSocket::MyTcpSocket(QObject *parent) :/*在构造函数中进行信号和槽函数的连接*/

QTcpSocket(parent)

{

connect(this,SIGNAL(readyRead()),     /*读信号和对应的槽函数处理*/

SLOT(slotReadyread()));

connect(this,SIGNAL(disconnected()),   /*断开连接的信号和对应的槽函数处理*/

SLOT(slotDisconnect()));

}

void MyTcpSocket::slotReadyread()

{

QString msg;

QByteArray ba;        /*采用QByteArray字节数组的方式客户端发送消息进行读取* /

ba.resize(this->bytesAvailable());    /*判断是否可读*/

this->read(ba.data(),ba.size());      /*读取客户端发送的消息*/

msg=QString(ba);         /*将接收到的消息转化为QString类型*/

emit updatemsg(msg,this->socketDescriptor(),this->peerAddress().toString());/*将客户端的信息通过信号的方式发送出去(信号包括客户端输入内容、客户端对应的描述符以及客户端的IP地址)*/

}

void MyTcpSocket::slotDisconnect()

{

qDebug("Disconnect host");

emit signalDisconnect(this->socketDescriptor()); /*将断开的客户端所对应的描述符信号发送出去*/

}

//========================Myserver.c=============================//

MyTcpserver::MyTcpserver(QObject *parent) :   /*在构造函数中监听*/    QTcpServer(parent)

{

listen(QHostAddress::Any,8080);/*监听任何客户端IP地址的连入,以及端口号为8080的*/

/**/

}

void MyTcpserver::incomingConnection(qintptr socketDescriptor){/*incomingConnection这个函数在服务端被客户端连接上后自动调用此函数,传入的参数为该客户端特有的描述符*/

qDebug("incomingConnection");

MyTcpSocket* sock = new MyTcpSocket;   /*新建一个Mysocket的对象*/

sock->setSocketDescriptor(socketDescriptor); /*设置sock的描述符*/

connect(sock,SIGNAL(signalDisconnect(qintptr)),

this,SLOT(slotDisconnect(qintptr))); /*断开连接的信号和对应的槽函数处理*/

connect(sock,SIGNAL(updatemsg(QString,qintptr,QString)),

this,SLOT(slotupdatemsg(QString,qintptr,QString)));/*将Mysocket发送过来客户端的信息进行处理,用于发送给UI界面*/

connect(sock,SIGNAL(updatemsg(QString,qintptr,QString)),

this,SLOT(slotrecivermsg(QString,qintptr,QString)));/*将Mysocket发送过来客户端的信息进行处理,再发送给其他连入的客户端*/

clients << sock; /*创建的一个QList的容器类名为clients,将每个不同的客户端放入到该容器中,以便后续处理*/

}

void MyTcpserver::slotDisconnect(qintptr sockfd)/*断开槽函数处理主要是将断开的客户端从容器中移除*/

{

int i=0;

for(i=0;i<clients.count();i++){              /*遍历容器中存入的客户端*/

if(clients.at(i)->socketDescriptor()==sockfd){/*当找到容器中对应的那个断开的客户端后,将其移除*/

clients.removeAt(i);

break;

}

}

}

void MyTcpserver::slotupdatemsg(QString msg,qintptr sockfd,QString IP)

{

qDebug()<<"slotupdatemsgServer";

emit updatemsgServer(msg,IP);   /*将客户端信息通过信号的方式传送给UI界面*/

}

void MyTcpserver::slotrecivermsg(QString msg,qintptr sockfd,QString IP)

{

QString message;

message=IP+" : "+msg;     /*设定回复给其他客户端的信息格式*/

int i=0;

for(i=0;i<clients.count();i++){

if(clients.at(i)->socketDescriptor()!=sockfd){ /*遍历容器中存入的客户端*/

clients.at(i)->write(message.toLatin1(),message.length());/*将消息发送给除自己以外的所有连入的客户端*/

}

}

}

//========================server.c=============================//

tcpserver::tcpserver(QWidget *parent) :  /*在构造函数中进行信号和槽函数的连接*/

QWidget(parent),

ui(new Ui::tcpserver)

{

ui->setupUi(this);

server = new MyTcpserver;   /*新建一个MyTcpserver对象*/

connect(server,SIGNAL(updatemsgServer(QString,QString)),

this,SLOT(recivermsg(QString,QString)));/*将MyTcpservert发送过来客户端的信息进行界面显示处理*/

}

tcpserver::~tcpserver()  /*析构函数中释放ui*/

{

delete ui;

}

void tcpserver::recivermsg(QString msg,QString IP)

{

qDebug("recivermsg");

qDebug()<<msg;

ui->listWidget->addItem(IP+" : "+msg);  /*显示发送的信号到UI界面上*/

}

最后感谢汇文,在汇文培训学习也有三个多月了,在这个融洽的大家庭中,感觉每天都很充实,在学习中实践,在实践中收获,愿自己在将来能找到一份合适的工作。

时间: 2024-08-10 15:51:43

Qt学习心得之网络编程简单的局域网聊天服务端建立的相关文章

TCP/IP网络编程之基于TCP的服务端/客户端(二)

回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服务端的I/O代码 echo_server.c --while ((str_len = read(clnt_sock, messag, 1024)) != 0) write(clnt_sock, messag, str_len);-- 接着,我们回顾客户端的代码 echo_client.c -- wr

java网络编程TCP传输—流操作—服务端反馈与客户端接收

在读取完流后,服务端会向客户端返回一些数据,告诉客户端,已经写完了. 在这里和”流操作—拿到源后的写入动作“差不多,客户端同样以byte与Buffered两种缓冲读取作为例子,同时,.也是希望大家给补充. 1.利用OutputStream向客户端回写,客户端用byte作为缓冲接收 向客户端回写: 1 //获取socket输出流,将上传成功字样传给客户端 2 OutputStream out=s.getOutputStream(); 3 out.write("上传成功".getBytes

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Socket网络编程--简单Web服务器(1)

这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码,使用C语言.这一小节就不讲别的内容了.就对这个程序进行一些注释和讲解了. 主函数: 1 int main(void) 2 { 3 int server_sock = -1; 4 u_short port = 0; 5 int client_sock = -1; 6 struct sockaddr_

c#学习之Socket网络编程

我是新手以前没写过博客 希望大家勿喷, 在编写Socket的时候需要导入System.Net.Socket 命名空间.利用该类我们可以直接编写Socket的客户端和服务的的程序了, 这里我们只讲tpc协议下的Socket编程. TCP Socket连接的过程可以简单的分为:①.服务端监听 ②.客户端请求 ③.建立连接, 在服务端: (1)声明一个套接字(称为监听套接字)Socket serverSocket = new Socket(AddressFamily.InterNetwork, Soc

JAVA学习之TCP网络编程,Socket使用

ServerSocket 此类实现服务器套接字. ServerSocket常用的构造方法有以下几个, ServerSocket() 创建非绑定服务器套接字. ServerSocket(int port) 创建绑定到特定端口的服务器套接字. ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号. ServerSocket(int port, int backlog, InetAddress bindAddr

Linux网络编程(简单的时间获取服务器)

1.一个简单的服务器时间获取程序 服务器和客户端采用UDP通信的方式,来编写一个简单的时间获取应用. 把过程大致理顺一下,首先是服务器端的编写,使用的是迭代的方式,没有并发 先创建一个socket而后bind服务器,绑定之后就可以创建一个循环来接收和发送 信息了,以达到和客户端之间的通信. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include

Socket网络编程--简单Web服务器(6)

本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息,例如一个配置类的一个属性为PAGE404的字符串,该字符串保存一个文件地址,然后我们的Page_404函数就可以用access判断PAGE404这个字符串对应的文件是否存在,如果存在那么如果是404页面那么就cat这个文件,而不是默认的404函数里面的页面.还有个端口什么的都是通过一个类似宏定义一

linux 网络编程之最简单的tcp通信服务端

编写一个最为简单的tcp通信服务端.代码如下: #include <iostream> #include <cstring> using namespace std; #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <uni