使用socket实现网络聊天室和私聊功能

 更新时间:2017年12月15日 14:12:01   作者:jike_chengwei  
这篇文章主要介绍了使用socket实现网络聊天室和私聊功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

使用socket技术实现网络聊天室和私聊功能,具体内容如下

话不多说先上图:

1、聊天室群聊页面

在线用户的联系人列表

socket连接页面

私聊页面

项目介绍

与服务端实现socket连接:每个客户端连接到服务器的时候,服务器会将每个连接的socket保存在list集合中。

群聊功能:当有一个用户发送群聊消息给服务器的时候,服务器会将所有信息转发给list列表中的所有已连接的客户端。

私聊功能:用户发送私聊信息给服务器后,服务器会向一个目标ip发送消息。

显示在线联系人列表:当有新用户登录成功的时候,服务器会将在线联系人的信息用json字符串的形式发送给客户端,客户端通过解析json字符串来获取在线联系人的信息。

自定义一个强大的类SocketEvent:客户端与服务器通信全部都是通过这个类来保存数据的,然后使用fastjson工具来把类对象转换为json字符串来传输。

public class SocketEvent {

  private int type =0;

  private String msg ="";

  private String keyIP =""; // 关键IP

  private String temporaryIP =""; // 临时IP

  public SocketEvent() {
  }

  public int getType() {
    return type;
  }

  public void setType(int type) {
    this.type = type;
  }

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

  public String getKeyIP() {
    return keyIP;
  }

  public void setKeyIP(String keyIP) {
    this.keyIP = keyIP;
  }

  public String getTemporaryIP() {
    return temporaryIP;
  }

  public void setTemporaryIP(String temporaryIP) {
    this.temporaryIP = temporaryIP;
  }
}

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地址

服务端代码 (ServerSocket)

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();
          }
        }

      }
    }

客户端在mainActivity中接受来自服务端的所有信息,根据type来进行再次分装,使用Eventbus将信息发送给各个fragment来进行展示

@Subscribe(threadMode = ThreadMode.MAIN)
  public void privateChat(SocketEvent event) {
    switch (event.getType()) {
      case MyApplication.CHAT_PRIVATE:
        // 将消息post给私聊聊天室
        ChatMessageBean bean = new ChatMessageBean();
        bean.setMsg(event.getMsg());
        bean.setName(event.getKeyIP());
        bean.setType(ChatMessageBean.OTHERS_ARG);
        EventBus.getDefault().post(bean);
        break;

      case MyApplication.SEND_PRIVATE:
        sendMsg(JSON.toJSONString(event));
        break;
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Invalid bound statement(not found):错误的解决方案

    Invalid bound statement(not found):错误的解决方案

    本文介绍了在开发Java SpringBoot应用程序时出现的"Invalidboundstatement(notfound)"错误的原因及解决方法,该错误通常与MyBatis或其他持久化框架相关,可能是由于配置错误、拼写错误或其他问题引起的,解决方法包括检查SQL映射文件
    2025-01-01
  • Java 全排列的几种实现方法

    Java 全排列的几种实现方法

    本文详细介绍了Java中全排列问题的几种实现方法,包括回溯法、字典序排列法和迭代法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方法

    SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方

    在实际的开发过程中一个互联网的项目来说 ,有可能会涉及到调用外部接口的实际业务场景,下面通过本文给大家介绍SpringBoot 项目 使用hutool 工具进行 http 接口调用的处理方法,需要的朋友可以参考下
    2022-06-06
  • 详解springboot解决第三方依赖jar包的问题

    详解springboot解决第三方依赖jar包的问题

    本篇文章主要介绍了详解springboot解决第三方依赖jar包的问题,解决了第三方依赖jar包的问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java解压缩zip - 解压缩多个文件或文件夹实例

    Java解压缩zip - 解压缩多个文件或文件夹实例

    本篇文章主要介绍了Java解压缩zip - 解压缩多个文件或文件夹实例,非常具有实用价值,有需要的可以了解一下。
    2016-12-12
  • Java中的对象流总结(必看篇)

    Java中的对象流总结(必看篇)

    下面小编就为大家带来一篇Java中的对象流总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java去除字符串空格的几种方法简单举例

    Java去除字符串空格的几种方法简单举例

    在Java中要去掉字符串中的空格,可以使用多种方法,这篇文章主要给大家介绍了关于Java去除字符串空格的几种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • SpringCloud Gateway中GatewayFilterChain执行流程详解

    SpringCloud Gateway中GatewayFilterChain执行流程详解

    Spring Cloud Gateway旨在为微服务架构提供一种简单有效的、统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,它不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等
    2022-10-10
  • 一篇文章带你入门Java封装

    一篇文章带你入门Java封装

    Java面向对象的三大特性:封装、继承、多态。下面对三大特性之一封装进行了总结,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • 一道关于java异常处理的题目

    一道关于java异常处理的题目

    本文给大家分享一道关于java异常处理的题目,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09

最新评论