前面已经学习了怎么把这个网络编程的聊天功能用界面开发的形式呈现这次这个是正式入门一下实现通讯网络编程的一个核心思想就是消息协议\通信协议。通过这个协议来判断传什么是传什么类型传文本图片还是表情包啥的。通过宇哥讲的代码结构和在我之前写的结构上加这个功能时就发现有这个私聊群聊的呈现形式有两种一种是从客户端那里来解析这个消息协议另一种是从服务端那里解析这个消息协议。一开始再听宇哥讲的时候宇哥主要改的是客户端的逻辑而我这里改的是服务端的逻辑。宇哥那种形式就是解析出来在对应的发而我这里因为在服务端那里有一个handleClient所有把逻辑写到了这里。再这其中也遇见了很多问题都是一些对Java的一些数据类型不熟悉导致的比如String字符串里面但个字符的提取啥的。通过也一边这个的代码原理我明白了传信息不是最难的通过bype然后在按照对应的实现转换编码即刻难的是如何在客户端那里渲染难的是如何在相应的场景传相应特点的信息如直播就应该尽量减小耗时在商业场景就是要极大保证信息的安全隐私可复原和防风险等特点。目前我这个版本信息还都是通过数组内存来存呢没有持久化这是决对不行的。后面我也会加上相应的数据持久化。publicvoidhandleClient(Socketself,CopyOnWriteArrayListSocketsockets,ConcurrentHashMapString,SocketuserMap,Useruser){try{InputStreaminself.getInputStream();// 广播加入消息broadcast(sockets,[系统] user 加入了聊天室);while(true){Stringmsgreceive(in,self);if(msgnull)break;System.out.println(收到 [user] : msg);// 解析消息格式为 发送者: 内容intcolonIdxmsg.indexOf(: );if(colonIdx0){Stringcontentmsg.substring(colonIdx2);if(content.startsWith()){// ── 私聊用户名 消息内容 ──intspaceIdxcontent.indexOf( );if(spaceIdx0){StringtargetNamecontent.substring(1,spaceIdx);StringprivateMsgcontent.substring(spaceIdx1);SockettargetuserMap.get(targetName);if(target!null){try{send([私聊] user: privateMsg,target.getOutputStream());send([私聊→targetName] user: privateMsg,self.getOutputStream());}catch(IOExceptionignored){}}else{try{send([系统] 用户 [targetName] 不存在或已离线,self.getOutputStream());}catch(IOExceptionignored){}}}}else{// ── 群聊广播给所有人 ──broadcast(sockets,msg);}}}}catch(IOExceptione){System.out.println(self.getInetAddress() 连接异常);}finally{sockets.remove(self);userMap.remove(user.getUsername());broadcast(sockets,[系统] user 离开了聊天室);System.out.println(移除 self.getInetAddress()当前连接数: sockets.size());}}