多用戶即時通訊系統03
4.編碼實作02
4.4功能實作-私聊功能實作
4.4.1思路分析
- 客戶端 - 發送者:
- 用戶在控制臺輸入資訊,客戶端接收內容
- 將訊息構建成Messgae物件,通過對應的socket發送給服務器
- 服務器:
- 可以讀取到客戶端(發送者)發送給某個用戶(接收者)的訊息
- 從管理執行緒的集合中,根據messgae物件的資訊,獲取到接收者的userId,從而獲取接收者的socket
- 最后將Message物件轉發給指定客戶(接收者)
- 客戶端 - 接收者:
- 在接收者的執行緒(通信執行緒中),讀取到發送者的message訊息,并顯示即可
4.4.2代碼實作
1.客戶端
1.MessageClientService類
這里新建一個類,專門用來管理聊天(私聊/群聊)的功能
package qqclient.service;
import qqcommon.Message;
import qqcommon.MessageType;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;
/**
* @author 李
* @version 1.0
* 該類提供和訊息(私聊、群聊)相關的服務方法
*/
public class MessageClientService {
/**
* @param content 內容
* @param senderId 發送用戶id
* @param getterId 接收用戶id
*/
public void sendMessageToOne(String content, String senderId, String getterId) {
//構建 message
Message message = new Message();
message.setMesType(MessageType.MESSAGE_COMM_MES);//設定訊息型別是普通的聊天型別
message.setSender(senderId);
message.setGetter(getterId);
message.setContent(content);
message.setSendTime(new Date().toString());//發送時間也封裝到message物件中
System.out.println(senderId + " 對 " + getterId + " 說 " + content);
//發送給服務端
try {//在管理執行緒的集合中,通過userId來獲取執行緒,通過執行緒來獲取對應的socket,再通過socket獲取輸出流
ObjectOutputStream oos =
new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(senderId).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.修改:ClientConnectServerThread類
在該類的run方法中修改業務代碼,增加else if陳述句
else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {
//接收到的是普通的聊天訊息
//就把服務器轉發的訊息,顯示到控制臺即可
System.out.println(message.getSendTime() + "\n" + message.getSender()
+ " 對" + message.getGetter() + " 說" + message.getContent());
}
3.修改處:QQView類
- 在類中增加屬性messageClientService
private MessageClientService messageClientService = new MessageClientService();//該物件用于私聊/群聊
- 在類中的內層回圈中呼叫messageClientService物件中的方法
case "3":
System.out.println("請輸入想聊天的用戶號(在線):");
String getterId = Utility.readString(50);
System.out.println("請輸入想說的話:(100個字符以內)");
String content = Utility.readString(100);
//撰寫一個方法,將訊息發送給服務端
messageClientService.sendMessageToOne(content,userId,getterId);
break;
2.服務端:
1.修改:ServerConnectClientThread類
- 在該類中增加方法getSocket()
public Socket getSocket() {
return socket;
}
- 在該類中的run方法中增加私聊的業務代碼
else if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {
//業務三:客戶請求和某用戶私聊
//根據message獲取getterId,再得到接收者對應的執行緒
ServerConnectClientThread serverConnectClientThread =
ManageClientThreads.getServerConnectClientThread(message.getGetter());
//得到對應的socket的輸出流,將message轉發給指定的用戶
ObjectOutputStream oos =
new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
oos.writeObject(message);//轉發訊息,提示:如果客戶不在線,可以保存訊息到資料庫,實作離線留言
}

運行:
2.客戶端:登錄三個用戶菩提老祖、至尊寶、紫霞仙子,使其相互通信:
用戶1:
用戶2:

用戶3:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/509313.html
標籤:其他
上一篇:對于Java中權限修飾符的理解
下一篇:純注解開發模式
