话不多说先上图:
聊天室群聊页面在线用户的联系人列表
socket连接页面
私聊页面
type: 标志当前发送的信息是什么类型的信息。服务端和客户端解 析数据就是通过这个它来判断属于哪种类型的消息
public static final int CHAT_PRIVATE = 111; // 私聊的指令 public static final int CHAT_GROUP = 222; // 群聊的指令 public static final int SOCKET_SUCCESS = 333; // socket连接成功的指令 public static final int SOCKET_FAIL = 444; // socket连接失败的指令 public static final int CONNECT_SUCCESS = 666; // socket连接成功的指令 public static final int CONNECT_FAIL = 777; // socket连接失败的指令 public static final int LOGIN_ARG = 888; // socket接收到标志新用户登录的指令 public static final int CANCEL_ARG = 999; // socket接收到标志用户注销的指令 public static final int NEW_CLIENT = 3332; // 新用户登录的指令 public static final int ALL_CLIENT = 3432; // 新用户登录后接收到所有在线用户的指令 public static final int SEND_PRIVATE = 5666; // 发送私聊消息的指令 public static final int SEND_IPlIST = 6666; // 发送已登录的用户IP集合的指令keyIP:客户端消息发起者的ip地址
temperoryIP:临时的IP地址,如果是type是私聊类型的那么这个ip代表的就是目标联系人的ip地址
1. 接收客户端的连接
Socket Socketclient = server.accept();2.开启线程实时接收来自客户端的信息
// 实时获取客户端发送的数据 @Override public void run() { try { while (true) { if ((acceptLine = in.readLine()) != null) { System.out.println("<接收到的消息是>" + acceptLine); SocketEvent event = JSON.parseObject(acceptLine, SocketEvent.class); switch (event.getType()) { case UtilFactory.CHAT_GROUP: sendMsgAvoid(event.getKeyIP(), acceptLine); break; case UtilFactory.SEND_PRIVATE: event.setType(UtilFactory.CHAT_PRIVATE); sendMsgTarget(event.getTemporaryIP(), JSON.toJSONString(event)); break; } } } } catch (Exception e) { e.printStackTrace(); } }3. 向指定ip发送消息的方法和除了自己ip向其他所有ip发送消息的方法
// 向指定的ip地址发送消息 private void sendMsgTarget(String targetIP, String msg) { int num = mList.size(); for (int index = 0; index < num; index++) { Socket mSocket = mList.get(index); String ip = mSocket.getInetAddress().getHostAddress(); if (ip.equals(targetIP)) { PrintWriter pout = null; try { pout = new PrintWriter( new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true); pout.println(msg); // 退出方法 return; } catch (IOException e) { e.printStackTrace(); } } } } // 向除了这个ip以外的所有ip发送 private void sendMsgAvoid(String avoidIP, String msString) { int num = mList.size(); for (int index = 0; index < num; index++) { Socket mSocket = mList.get(index); String ip = mSocket.getInetAddress().getHostAddress(); if (!ip.equals(avoidIP)) { PrintWriter pout = null; try { pout = new PrintWriter( new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true); pout.println(msString); } catch (IOException e) { e.printStackTrace(); } } } }