亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用socket實現網絡聊天室和私聊功能

發布時間:2020-09-01 17:29:04 來源:腳本之家 閱讀:405 作者:jike_chengwei 欄目:編程語言

使用socket技術實現網絡聊天室和私聊功能,具體內容如下

話不多說先上圖:

1、聊天室群聊頁面

使用socket實現網絡聊天室和私聊功能

在線用戶的聯系人列表

使用socket實現網絡聊天室和私聊功能

socket連接頁面

使用socket實現網絡聊天室和私聊功能

私聊頁面

使用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;
    }
  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洪江市| 扶风县| 贵港市| 庐江县| 米脂县| 天全县| 和龙市| 大连市| 德钦县| 上虞市| 沅陵县| 固安县| 贵阳市| 晋中市| 宿迁市| 高州市| 连州市| 新巴尔虎右旗| 育儿| 葫芦岛市| 大连市| 泰宁县| 浠水县| 苍梧县| 三亚市| 伊宁县| 广河县| 万源市| 陵川县| 静宁县| 通海县| 阳春市| 界首市| 商洛市| 平江县| 内丘县| 浦县| 军事| 临高县| 白山市| 武山县|