# ChatRoom **Repository Path**: hardtochill/chat-room ## Basic Information - **Project Name**: ChatRoom - **Description**: Java网络聊天室项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-27 - **Last Updated**: 2024-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 消息协议 一个消息包包含: 总长 int totallen 4个字节 消息类型 byte type 1个字节 目标对象 byte[20] target 20个字节 消息内容 byte[totallen-4-1-20] data type: 服务器与客户端处理请求的方法一一对应 1注册 requestRegister——>respondRegister——>getRegister 2登录 requestLogin——>respondLogin——>getLogin 3退出 requestQuit——>deleteClient 4好友上线 addClient——>addUser 5好友下线 deleteClient——>deleteUser 6收发消息 7收发文件 target: (1)取一个定长20个字节的数组,String类型的id转成byte[]数组时:对于单个char,中文字符2个字节,其它1个字节 (2)有String转到byte[]后,若target.getlength<20,则补'\0'补到20。'\0'对应的ascii码为null,但也占位 (3)读取target后转成String,再调用String.trim()就可以去除用于补长的'\0' (4)target = 0 时表示接收对象是服务器,即传给整个聊天室的用户 data: (1)若为注册/登录,则data[]前20个字节为ID,后20个字节为PWD,写入要补长,读取要去空 (2)若为收发消息: 对客户端而言:data[]第0个字节表示是群发还是私发,群发则显示在公屏上,私发则单开一个窗口 1——21个字节为发送这条消息的ID 对服务器而言:targetID为“0”表示服务器,收到消息后直接发给所有在线用户 targetID不为“0”表示私聊,服务器将这条消息发给特定对象 对于私聊窗口的处理: 每一个ClientThread类里都有一个HashMap,存储,代表当前用户与所有用户进行私聊的窗口 PersonalChatFrame窗口同样用的是Listener类监听器,注意按钮命名要与群聊窗口的按钮命名区分开 document: 发送文件: 1.为了应对发送超大文件,应把文件切分发送,把文件的data[]定为5部分:1+20+4+60+n (1)byte:群发or私法;0表群发,1表私发 (2)byte[20] fromID:发送此文件段的用户id (3)byte[4] process:表明当前文件段在总文件切分段的序号,用4个字节表示整型数 (4)byte[60] fileName:此文件在发送端的文件名 (5)byte[len] data:文件段的数据 process=1表示开始发送文件,process=1的文件包内容为该文件在发送方的文件名,客户端接收到该包后,在缓冲文件夹中创建相同文件名的文件 process=n(n>1)表示当前文件段是总文件的第n段,根据文件名去缓冲文件区找到对应缓冲文件并写入 process=-1表示结束文件发送 上述的process是转成整型数之后的值 (4)byte[]:文件段字节数据。当process=-1时此部分为空 2. (1)客户端发送的data[]为4+60+len: process+文件段内容 (2)服务器收到data[]后进行包装,包装后的data[]为1+20+[4+60+len]: type群发私发 + fromID + process + fileName+len 服务器包装只是给客户端发送的data[]加上两个前缀,不用去拆包 (3)客户端收到data[]后进行解析: 取出两个前缀type+fromID后还要再取一个process和一个fileName 3.客户端发送文件段的操作是在一个while()循环中进行,是持续不断地发送, 服务器也持续不断地转发 因此接收方客户端应该 (1)先创建一个本地默认文件夹专门用于接收文件,称为缓冲文件夹,不管是否接收都将文件段写入该默认文件夹 (2)若选择接收,则把该缓冲文件夹中地文件搬到指定路径 (3)最后删除默认文件夹内容(暂时不用删除,就保留在本地)