国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

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

2024-07-13 10:14:45
字體:
來源:轉載
供稿:網友

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

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 裕民县| 宿松县| 塔河县| 桓台县| 唐山市| 铅山县| 绥中县| 成都市| 桓仁| 金寨县| 衡东县| 上思县| 翁源县| 武城县| 瑞金市| 河南省| 广水市| 珲春市| 和林格尔县| 乃东县| 沂南县| 米林县| 新绛县| 永嘉县| 淮安市| 尤溪县| 陆河县| 云林县| 中超| 中宁县| 遵义市| 内黄县| 右玉县| 高雄市| 布拖县| 明水县| 梧州市| 保山市| 岑巩县| 昌平区| 彭水|