- 实验题目
- 实验目的
1、了解Socket通信的原理,学会使用Socket进行简单的网络编程,在此基础上编写一个聊天程序。
2、了解Qt编程,熟悉C++语言。
- 总体设计
1、背景知识
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。用户数据报协议(UDP,User Datagram Protocol)是一种无需建立连接就可以发送封装的 IP 数据包的传输层通信协议。它不提供数据包分组、组装、对数据包进行排序、报文到达确认、流量控制等功能。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
2、基本原理
Socket是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方的内容,通讯结束时关闭文件。
Socket在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
Socket保证了不同计算机之间的通信,对于网站,通信模型是服务器与客户端之间的通信。两端都建立一个socket对象,然后通过socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。
3、模块介绍
(1)服务器端:监听本网络上的所有Ip,如有连接请求,则通过连接,与客户端进行一对一通信。
(2)客户端:通过给定的端口号与Ip地址连接到服务器端,与服务器端进行通信。
4、设计步骤
(1)服务端
- 加载套接字库,创建套接字(QTcpSocket)
- 绑定套接字到一个 IP 地址和一个端口上(bind())
- 将套接字设置为监听模式等待连接请求(listen())
- 请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept())
- 用返回的套接字和客户端进行通信(send())
- 返回,等待另一连接请求
- 关闭套接字,关闭加载的套接字库
(2)客户端
- 加载套接字库,创建套接字(QTcpSocket)
- 向服务器发出连接请求(connect())
- 和服务器端进行通信(send())
- 关闭套接字,关闭加载的套接字库
- 详细设计
1、程序流程图
2、代码
(1)服务器端
代码组成:
server.h
#ifndef SERVER_H
#define SERVER_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
QT_BEGIN_NAMESPACE
namespace Ui { class server; }
QT_END_NAMESPACE
class server : public QMainWindow
{
Q_OBJECT
public:
server(QWidget *parent = nullptr);
~server();
private: