您的位置:首页 > 理论基础 > 计算机网络

写一个Tomcat+Okhttp实现的聊天websocket聊天框架(二)--完成私聊功能

2017-04-06 23:33 357 查看
上一篇中,完成了客户端和服务端的网络,算一个helloworld。只是,服务端使用的是Tomcat给的例子,客户每发一条消息,都会广播到每一个在线的用户。如果我们在撩妹子的时候,还要广播到正牌女友那里,这就尴尬了,显然不符合正常的业务需求,当做一个群聊或许还可以。

下面我们就通过修改服务端的代码,来实现一对一的功能。从上一节中ChatAnnotation这个类中,我们可以知道,所有与服务器保持连接的客户端,都有一个静态Set集合中保存的ChatAnnotation对象。而发消息的时候,通过遍历Set依次发送,那么我们就找到突破口了。如果每一个被保存的对象,都保持唯一的标识(这个标识可以是用户的id),另外一个用户想和他私聊时,通过这个id找到对应的ChatAnnotation对象,再进行发送消息,就完成聊天的功能了。这种键值对的存储,我们使用HashTable来说代替Set。

   我们键值对的关系是 id->session,这是因为在OnOpen中药拿到ID还需要获得Websocket握手时的Request对象, 在这里为了开发方便,在客户端中中将己方id,对方id拼接到消息里,再通过编写Utils方法,解析到对应的数据。

private static final Map<String,Session> map=new Hashtable<>();


@OnMessage
public void onMessage(String message){
String myId=Utils.getMyId(message);
this.myId=myId;
Session session;
if((session=map.get(myId))==null){
map.put(myId, this.session);
}
String herId=Utils.getHerId(message);
try {
if((session=map.get(herId))==null){
this.session.getBasicRemote().sendText(herId+" is not online");
return;
}
session.getBasicRemote().sendText(myId+" said: "+Utils.getMessage(message));
} catch (IOException e) {
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐