最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能

 更新時(shí)間:2017年12月15日 14:12:01   作者:jike_chengwei  
這篇文章主要介紹了使用socket實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

使用socket技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)聊天室和私聊功能,具體內(nèi)容如下

話不多說先上圖:

1、聊天室群聊頁面

在線用戶的聯(lián)系人列表

socket連接頁面

私聊頁面

項(xiàng)目介紹

與服務(wù)端實(shí)現(xiàn)socket連接:每個(gè)客戶端連接到服務(wù)器的時(shí)候,服務(wù)器會(huì)將每個(gè)連接的socket保存在list集合中。

群聊功能:當(dāng)有一個(gè)用戶發(fā)送群聊消息給服務(wù)器的時(shí)候,服務(wù)器會(huì)將所有信息轉(zhuǎn)發(fā)給list列表中的所有已連接的客戶端。

私聊功能:用戶發(fā)送私聊信息給服務(wù)器后,服務(wù)器會(huì)向一個(gè)目標(biāo)ip發(fā)送消息。

顯示在線聯(lián)系人列表:當(dāng)有新用戶登錄成功的時(shí)候,服務(wù)器會(huì)將在線聯(lián)系人的信息用json字符串的形式發(fā)送給客戶端,客戶端通過解析json字符串來獲取在線聯(lián)系人的信息。

自定義一個(gè)強(qiáng)大的類SocketEvent:客戶端與服務(wù)器通信全部都是通過這個(gè)類來保存數(shù)據(jù)的,然后使用fastjson工具來把類對(duì)象轉(zhuǎn)換為json字符串來傳輸。

public class SocketEvent {

  private int type =0;

  private String msg ="";

  private String keyIP =""; // 關(guān)鍵IP

  private String temporaryIP =""; // 臨時(shí)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: 標(biāo)志當(dāng)前發(fā)送的信息是什么類型的信息。服務(wù)端和客戶端解 析數(shù)據(jù)就是通過這個(gè)它來判斷屬于哪種類型的消息

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接收到標(biāo)志新用戶登錄的指令
  public static final int CANCEL_ARG = 999; // socket接收到標(biāo)志用戶注銷的指令
  public static final int NEW_CLIENT = 3332; // 新用戶登錄的指令
  public static final int ALL_CLIENT = 3432; // 新用戶登錄后接收到所有在線用戶的指令
  public static final int SEND_PRIVATE = 5666; // 發(fā)送私聊消息的指令
  public static final int SEND_IPlIST = 6666; // 發(fā)送已登錄的用戶IP集合的指令


keyIP:客戶端消息發(fā)起者的ip地址

temperoryIP:臨時(shí)的IP地址,如果是type是私聊類型的那么這個(gè)ip代表的就是目標(biāo)聯(lián)系人的ip地址

服務(wù)端代碼 (ServerSocket)

1. 接收客戶端的連接

Socket Socketclient = server.accept();

2.開啟線程實(shí)時(shí)接收來自客戶端的信息

// 實(shí)時(shí)獲取客戶端發(fā)送的數(shù)據(jù)
    @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發(fā)送消息的方法和除了自己ip向其他所有ip發(fā)送消息的方法

// 向指定的ip地址發(fā)送消息
    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();
          }
        }

      }
    }

    // 向除了這個(gè)ip以外的所有ip發(fā)送
    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中接受來自服務(wù)端的所有信息,根據(jù)type來進(jìn)行再次分裝,使用Eventbus將信息發(fā)送給各個(gè)fragment來進(jìn)行展示

@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;
    }
  }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Invalid bound statement(not found):錯(cuò)誤的解決方案

    Invalid bound statement(not found):錯(cuò)誤的解決方案

    本文介紹了在開發(fā)Java SpringBoot應(yīng)用程序時(shí)出現(xiàn)的"Invalidboundstatement(notfound)"錯(cuò)誤的原因及解決方法,該錯(cuò)誤通常與MyBatis或其他持久化框架相關(guān),可能是由于配置錯(cuò)誤、拼寫錯(cuò)誤或其他問題引起的,解決方法包括檢查SQL映射文件
    2025-01-01
  • Java 全排列的幾種實(shí)現(xiàn)方法

    Java 全排列的幾種實(shí)現(xiàn)方法

    本文詳細(xì)介紹了Java中全排列問題的幾種實(shí)現(xiàn)方法,包括回溯法、字典序排列法和迭代法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • SpringBoot 項(xiàng)目使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方法

    SpringBoot 項(xiàng)目使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方

    在實(shí)際的開發(fā)過程中一個(gè)互聯(lián)網(wǎng)的項(xiàng)目來說 ,有可能會(huì)涉及到調(diào)用外部接口的實(shí)際業(yè)務(wù)場(chǎng)景,下面通過本文給大家介紹SpringBoot 項(xiàng)目 使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方法,需要的朋友可以參考下
    2022-06-06
  • 詳解springboot解決第三方依賴jar包的問題

    詳解springboot解決第三方依賴jar包的問題

    本篇文章主要介紹了詳解springboot解決第三方依賴jar包的問題,解決了第三方依賴jar包的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例

    Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例

    本篇文章主要介紹了Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例,非常具有實(shí)用價(jià)值,有需要的可以了解一下。
    2016-12-12
  • Java中的對(duì)象流總結(jié)(必看篇)

    Java中的對(duì)象流總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄狫ava中的對(duì)象流總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java去除字符串空格的幾種方法簡(jiǎn)單舉例

    Java去除字符串空格的幾種方法簡(jiǎn)單舉例

    在Java中要去掉字符串中的空格,可以使用多種方法,這篇文章主要給大家介紹了關(guān)于Java去除字符串空格的幾種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解

    SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解

    Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等
    2022-10-10
  • 一篇文章帶你入門Java封裝

    一篇文章帶你入門Java封裝

    Java面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。下面對(duì)三大特性之一封裝進(jìn)行了總結(jié),需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • 一道關(guān)于java異常處理的題目

    一道關(guān)于java異常處理的題目

    本文給大家分享一道關(guān)于java異常處理的題目,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

乐都县| 阜平县| 深圳市| 锡林浩特市| 嵊泗县| 安国市| 阳西县| 灵台县| 衡东县| 庐江县| 博湖县| 驻马店市| 广昌县| 四会市| 潞西市| 宁夏| 错那县| 望谟县| 南丰县| 绥宁县| 庄河市| 新乡市| 安丘市| 北碚区| 平乐县| 仪陇县| 连云港市| 馆陶县| 军事| 武义县| 曲沃县| 青川县| 成武县| 奎屯市| 孝昌县| 日喀则市| 兴安县| 阳泉市| 大厂| 苍溪县| 霍林郭勒市|