1、TCP编程需要用到两个类:
1.1 QtcpServer和QtcpSocket.
TCP分为客户端和服务端。客户端用到QtcpSocket类;服务端用到了QtcpServer和QtcpSocket类。
1.2、在编程之前,我们先了解一下这两个类的作用:
QTcpServer:监听套接字,用于监听是否有客户端的连接。
QTcpSocket:通信套接字,用于实现数据的收发,属于设备IO类。
扩展:在QT中,提供IO设备类,这些设备具有读写子块的能力,提供了读写子块的接口:
2、linux下的tcp通信
2.1 流程图:
2.2 文字描述:
在linux下,会使用三个套接字。服务器两个(监听套接字和通信套接字),客户端一个(通信套接字)。
1)、服务器的监听套接字,这个套接字的意义是:通过bind()函数,给这个套接字绑定IP和端口号(服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。);
2)、通过listent()函数设置服务器同时监听的上限;
3)、accpet()函数,需要调用上面的套接字信息;然后就处于等待状态,直到客户端与服务端建立成功连接以后,accpet()函数会产生一个新的套接字(通信套接字),这个套接字用来和客户端之间的套接字连接、通信。上面的套接字就被释放出来,用来准备下一次的连接。
2.3 具体的流程如下:
server:
1. socket() 创建socket
2. bind() 绑定服务器地址结构
3. listen() 设置监听上限
4. accept() 阻塞监听客户端连接
5. read(fd) 读socket获取客户端数据
6. 小--大写 toupper()
7. write(fd)
8. close();
client:
1. socket() 创建socket
2. connect(); 与服务器建立连接
3. write() 写数据到 socket
4. read() 读转换后的数据。
5. 显示读取结果
6. close()
在QT的tcp编程中,整个过程简单很多:
3、QT下的tcp通信
3.1、流程图:
3.2 文字注释:
在QT中,同样会使用三个套接字。服务器两个(监听套接字和通信套接字),客户端一个(通信套接字)。
1)、服务器首先创建一个监听套接字。
2)、当监听套接字接受到客户端的连接,会自动触发newconnect()信号,在对应的槽函数中,产生通信套接字。
3)、如果是数据传送成功,对方的通信套接字会触发readyread()信号,需要在自己的槽函数中做,接受信号的处理。
4、二者不一样的地方:
1)、关于IP和端口号
linux下,在使用bind()函数绑定地址结构的时候,要注意IP和端口号的转化。
网络字节序采用的是大端法;本地字节序采用的是小端法。
因此,我们需要将本地字节序转化为网络字节序;
在QT中,我们直接使用listen函数,以小端法的方式直接输入IP和端口号即可。
2)、函数的区别
//实例化一个就按听套接字 对应linux下的socket()
tcpServer = new QTcpServer(this);
//监听来自客户端的连接 对应linux下的bind()和listen()
tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
/*接收来自客户端的通信套接字对象(tcpSocket是通信套接字)
对应linux下的accept() */
tcpSocket = tcpServer->nextPendingConnection();
5、总结:
这个工程只是简单地描述了基于TCP建立通信和数据收发的简单过程。 在真正的TCP在网络应用程序中,还需要处理很多突发的网络情况。如:连接过程中的错误处理,心跳包机制, 服务端强行断开连接后客户端的处理,数据粘包与断包,数据接收队列,等等。