日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 聊天室 私聊_使用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;

}

}

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

總結

以上是生活随笔為你收集整理的java 聊天室 私聊_使用socket实现网络聊天室和私聊功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。