提交日期:2012-06-20 基于 socket 的局域网聊天软件的设计与实现 1.实验目的 《Linux 操作系统课程设计 B》 是一门在课程 《Linux 操作系统与程序设计 B》 后独立开设的实验课程。 这一门实验课程的开设目的是为了通过学生独立完成一个基于 Linux 平台的较大型应用程序,巩固课堂上 学到的 Linux 平台上的编程规范、技术和技巧,培养学生的编写较大型程序的能力和提高学生综合应用素 质。 本课程设计实验主要围绕 Linux 平台上主流的基础技术展开,这些技术包括:Linux 的进程、线程通信和 同步技术; socket 网络通信技术等,这些技术可以集中体现并应用在并发程序设计中。通过并发程序的 设计与开发,培养学生底层软件开发的能力,并为将来从事 UNIX/Linux 平台开发、嵌入式开发等相对高 端的软件开发工作打下基础。 2.软件功能及模块划分 本软件是一个 linux 下基于 socket 的聊天室程序,能让局域网内的用户通过该软件进行简单的文字通信。 在此基础上增加了 1. 2. 3. 4. 聊天室成员之间的发送私聊信息; 当新的成员加入后能自动收取最近一段时间内的聊天上下文; 用户能够查看历史聊天记录; 软件界面基于 Qt 实现,图形化界面方便用户操作。 主要模块划分: 服务端: 数据包发送和接受模块,聊天记录数据库读写模块,数据包处理模块,聊天记录查询模块 客户端: 数据包发送和接受模块,数据包处理模块,聊天记录查询模块,用户界面与展示模块 3.设计与实现 3.1 系统概述与总体结构 本系统采用 CS 架构,服务端采用固定的端口通信,每个客户端动态设置端口。客户端启动后向服务端告 知自己所使用的端口号,以便可以双向通信,同时服务器负责为每个客户端分配一个唯一的 ID(服务器的 ID 为 1) 客户端和服务端以及客户端和客户端之间采用约定的数据格式进行通信,以便接收方可以正确的解析命令 和数据。 数据包通用格式定义如下 #define MAX_UDP_SIZE 1000 struct udp_packet{ int type; int senderId; long size; char content[MAX_UDP_SIZE]; }; type: 表示该数据包的类型,直接决定 content 字段的含义 senderId:该数据包的发送者的 ID, size:整个数据包的数据长度 content:数据包的内容,其数据格式由 type 决定。 服务器和客户端接受到数据包后,根据 type 字段的值来解析 content 字段的数据,从而作出正确的处理 和响应。 所有的数据包类型以及对应的 content 字段的数据结构全部定义在 define.h 文件中 [系统总体结构] 服务端初始化 服务端初始化 解析数据包 接受数据包 接受数据包 解析数据包 Soceket 通信 服务端数据处 理 发送数据(可 选) 发送数据(可 选) 客户端或用户主 动发送消息 客户端数据处 理 通知界面线程更新和 显示数据 通知界面线程更新和 显示数据 1 / 33 由上图可以看出,服务器和客户端程序在总体结构上相似。