我这里只显示需要添加的代码,其余代码与韩老师写的一样。
这里用户1发短信给用户2
大体思路:1.在服务器接收用户1输入信息ObjectInputStream的时候有两个分支(if-else),
第一,如果在线程池里用户2不存在,就把输入信息保存在concurrentHashMap
第二,如果线程池里存在用户2,就把输入信息通过ObjectOutputStream.WriteObject发给客户端。
2.在服务器,用户2发送登录成功MessageType给客户端的时候,同时把用户1的信息也发出去,通过message.setContent()。
建议自己在想一下,因为很简单,具体代码如下:
1.设定属性.private static ConcurrentHashMap<String, ArrayList<Message>>ofLineDb = new ConcurrentHashMap<>();
2.写方法用来保存内容
public static void dbmessage(String userId,Message message1){
if (!ManageClientThread.getHm().containsKey(userId)){
ArrayList<Message> messages1 = new ArrayList<>();
messages1.add(message1); ofLineDb.put(userId,messages1);
}
3.服务器对收到的信息进行分流 else if (o1.getMesType().equals(MessageType.MESSAGE_COMM_MES.getNum())){ //把客户端私聊的内容保存在dbmessage方法里的ConcurrentHashMap里 if (!ManageClientThread.getHm().containsKey(o1.getGetter())) { o1.setContent("\n"+o1.getSender()+"发消息说"+o1.getContent()); QQserver.dbmessage(o1.getGetter(), o1); } //传递给客户端,通过需要收到的用户id找到socket ServerConnectClientThread getserverconnectclietnthread = ManageClientThread.getserverconnectclietnthread(o1.getGetter()); ObjectOutputStream objectOutputStream = new ObjectOutputStream(getserverconnectclietnthread.getSocket().getOutputStream()); objectOutputStream.writeObject(o1); }
4.在服务器,当用户2登入时,从数组里取出用户1的信息打包过去。
if (ofLineDb.get(o1.getUserId())!=null){ ArrayList<Message> messages = ofLineDb.get(o1.getUserId()); Iterator<Message> iterator = messages.iterator(); while (iterator.hasNext()) { Message next = iterator.next(); message.setContent(next.getContent()); } }
5.客户端里输出
if (ManageClientConnectiServerThread.getccst(message.getGetter())==null){System.out.println(message.getGetter()+"用户已经离线");}else { System.out.println(senderId+"对"+getterId+"说"+content);}
服务器端的:
public class ServerConnectClientThread extends Thread{
private Socket socket;
private String userId;//连接到服务端的用户id
public ServerConnectClientThread(Socket socket, String userId) {
this.socket = socket;
this.userId = userId;
}
@Override
public void run() {//这里线程处于rum的状态,可以发送/接送消息
while(true){
System.out.println("服务端和客户端"+userId+"保持通信,读取数据...");
try {
ObjectInputStream objectInputStream = new Objec