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

上一篇中,完成了客户端和服务端的网络,算一个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();
		}
	}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值