# JFindMe Chat **Repository Path**: ycsoft/JFindMe-Chat ## Basic Information - **Project Name**: JFindMe Chat - **Description**: 聊天服务器 - **Primary Language**: Erlang - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2014-12-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #JFindMe Chat JFindMe聊天服务器 通信协议及相关配置说明 聊天服务器基于TCP\IP协议开发,用于支持多用户即时通信,同时支持文件传输、消息缓存等。该文档的目的在于向客户端应用程序开发者公开通信协议,便于其开发相关应用。 适用人群:了解Socket编程的软件工程师 基本要求:了解Socket通信基本流程,了解I/O复用技术,了解不同计算平台的内存存储特性,了解不同数据类型占用的内存空间。 (一)通信协议 为提高程序单位时间内的响应效率,服务端与客户端采用一套较为底层的通讯报文。客户端与服务端需在充分了解报文在内存中的存储方式的前提下进行相关功能的开发。 本系统的通信报文由两部分组成:1)报文头,用于指示报文边界及类型;2)报文体,报文主体部分,包含用户间的通讯信息。 表1. 报文头基本信息 属性项 H0 H1 数据类型 short short 正负 + + 存储空间大小 2字节 2字节 含义 包体长度 命令类型 1.1 H0包体长度计算 在本协议中,报文头中的H0用于指示实际需要处理的报文的长度,包括H1以及除报头的剩余部分。计算其取值时直接用报文总长度减去H0所占用的2个字节即可。 1.2 报文命令类型 报文头中的命令类型是在内存中占2字节存储空间的无符号短整型数。 目前该系统设计了用户上线、用户注册(暂不使用)、用户消息三种基本报文。 命令含义 命令类型取值 含义 0 上线报文 65535 上线失败 1 消息报文 11 消息发送失败 2 文件传输 4 注册报文 1.3 上线报文 客户端与服务器建立连接后需向服务器发送上线报文,以便服务器对其会话状态进行维护。 上线报文 Head ID Flag = 0 32B 上线报文由4字节的报文头Head和32字节的用户ID组成。需要注意的是实际用户的ID长度往往小于32字节,剩余的空间需全部用‘\0’进行填充。 当接收到Flag 为65535(亦即-1)的报文时,表明上线失败。 1.4 消息报文 消息报文是用户之间发送聊天信息的报文. 消息报文组成: Head From To msgLen Msg Flag = 1 32B 32B 2B 表3给出了消息报文的具体组成,主要由报文头Head, 发送者From,接受者To,消息内容长度msgLen和消息内容Msg组成。消息内容Msg的实际长度由msgLen指定,以此实现任意长度(小于65535字节)消息数据的发送。 对于发送消息报文,当命令类型标记Flag取值为11时,表示消息未能正常发送至目标用户。当收到Flag值为11的报文时,应提示用户信息发送失败。 1.5 文件传输协议 该协议用于在用户之间转发文件,协议中的内容包括报文头、发送者、接收者、文件名、文件类型(扩展名)、本次发送的文件数据长度、文件总长度、文件内容。 Head From To FileName FileType DataLen 总长度 Data Flag = 2 32B 32B 64B 2B short 2B short 4B uint32 byte 2:传文件 发送者 接收者 文件名 文件类型 本次数据长度 文件总长度 文件数据 该协议中,文件类型由用户自行制定并做相应处理,该值为占两字节的短整型数,用于向APP指示传输文件的类型,由APP开发人员自行制定文件类型数对应的文件扩展名,比如设定1代表jpg图片,2代表BMP图片,3代表png图片,4代表mp3音频文件等等,服务器端不对扩展名做处理,用户可随意指定,但要注意发送端和接收端保持对应关系一致。 文件总长度为占4字节的无符号整型数,指的是文件包含的总字节数。用户通过这两个数据可以判断当前文件传输的进度。 以用户发送一个56K大小的图片“chat.jpg”为例,程序循环读取文件进行发送,假设每次循环读取2048个字节,则报文中的文件名填充“chat.jpg”,文件类型填充1(仅供参考,设1代表jpg图片),本次数据长度填2048,总长度填57344(56K),文件数据填充从文件中读取的2048字节数据。 (二)服务端日志设置 服务端程序添加了日志功能,用于记录服务器与用户的交互情况,以便关管理员在程序出现异常时进行参考。 在Chat目录下有一settings.conf的文件,该文件目前包含了系统日志的设置,包括是否生成日志文件,日志的存储目录,写入方式等。 配置文件中,‘%’表示注释,程序会自动忽略所有以’%’开头的内容。注释的内容中请不要添加中文。与日志相关的设置项包括{logsave}与{logpath}。每个设置项都包含在一对花括号{}中,并以英文句点‘.’结束。 2.1 logsave:是否生成日志文件 Logsave表示是否让服务器生成日志文件,取值true或false。当取值为true时,将在服务端生成由logpath指定的日志文件,否则无日志文件生成。 2.2 logpath:日志文件名与写入方式 Logpath包含两项内容,日志文件的文件名以及文件的写入方式。文件名不需过多注解。写入方式目前支持write与append。当logsave设置为true时,采用write写入方式会生成新的日志文件,之前的内容会被全部擦除。当写入方式为append时,如果指定的文件不存在,则会新建文件;如果文件已存在,将向文件末尾添加新的日志内容。