赞
踩
很多人都开发过在线聊天室,但是很少有引入robot api的,如果有一个智能机器人和大家“聊骚”,这样聊天室的氛围岂不是更加愉快。
图灵机器人网址:http://www.tuling123.com/
注册登录后可设置一些机器人的基本信息(它还可以随着年龄的增长而学习知识技能的提升)
在知识库一栏可设置一些常用知识关键词汇的答案信息
能力扩展中开启你所涉及的领域:
下面开始在web中引入robot,先上图(当然也支持多人在线聊天)
怎么样,挺智能的吧。说说开发吧,首先要用到websocket和tomcat8
Js核心代码:
- var wsServer = null;
- var ws = null;
- //wsServer = "ws://" + location.host+"${pageContext.request.contextPath}" + "/chatServer";
- wsServer = "ws://localhost:8080/webChat/chatServer";//注意浏览器ip要与此处一致,否则session获取不到
- ws = new WebSocket(wsServer); //创建WebSocket对象
- ws.onopen = function (evt) {
- //alert('first onopen!');
- layer.msg("已经建立连接", { offset: 0});
- };
- ws.onmessage = function (evt) {
- //alert('first onmessage!');
- //alert('解析后台传回的消息,并予以展示');
- analysisMessage(evt.data); //解析后台传回的消息,并予以展示
- };
- ws.onerror = function (evt) {
- //alert('first onerror!'+evt);
- //console.log(evt);
- layer.msg("产生异常", { offset: 0});
- };
- ws.onclose = function (evt) {
- //alert('first onclose!');
- layer.msg("已经关闭连接", { offset: 0});
- };
-
- /**
- * 连接
- */
- function getConnection(){
- if(ws == null){
- ws = new WebSocket(wsServer); //创建WebSocket对象
- ws.onopen = function (evt) {
- layer.msg("成功建立连接!", { offset: 0});
- };
- ws.onmessage = function (evt) {
- analysisMessage(evt.data); //解析后台传回的消息,并予以展示
- };
- ws.onerror = function (evt) {
- layer.msg("产生异常", { offset: 0});
- };
- ws.onclose = function (evt) {
- layer.msg("已经关闭连接", { offset: 0});
- };
- }else{
- layer.msg("连接已存在!", { offset: 0, shift: 6 });
- }
- }
-
- /**
- * 关闭连接
- */
- function closeConnection(){
- if(ws != null){
- ws.close();
- ws = null;
- $("#list").html(""); //清空在线列表
- layer.msg("已经关闭连接", { offset: 0});
- }else{
- layer.msg("未开启连接", { offset: 0, shift: 6 });
- }
- }
-
- /**
- * 检查连接
- */
- function checkConnection(){
- if(ws != null){
- layer.msg(ws.readyState == 0? "连接异常":"连接正常", { offset: 0});
- }else{
- layer.msg("连接未开启!", { offset: 0, shift: 6 });
- }
- }
-
- /**
- * 发送信息给后台
- */
- function sendMessage(){
- if(ws == null){
- layer.msg("连接未开启!", { offset: 0, shift: 6 });
- return;
- }
- var message = $("#message").val();
- var to = $("#sendto").text() == "全体成员"? "": $("#sendto").text();
- if(message == null || message == ""){
- layer.msg("请不要惜字如金!", { offset: 0, shift: 6 });
- return;
- }
- $("#tuling").text() == "已上线"? tuling(message):console.log("图灵机器人未开启"); //检测是否加入图灵机器人
- ws.send(JSON.stringify({
- message : {
- content : message,
- from : '${userid}',
- to : to, //接收人,如果没有则置空,如果有多个接收人则用,分隔
- time : getDateFull()
- },
- type : "message"
- }));
- }
-
- /**
- * 解析后台传来的消息
- * "massage" : {
- * "from" : "xxx",
- * "to" : "xxx",
- * "content" : "xxx",
- * "time" : "xxxx.xx.xx"
- * },
- * "type" : {notice|message},
- * "list" : {[xx],[xx],[xx]}
- */
- function analysisMessage(message){
- message = JSON.parse(message);
- if(message.type == "message"){ //会话消息
- showChat(message.message);
- }
- if(message.type == "notice"){ //提示消息
- showNotice(message.message);
- }
- if(message.list != null && message.list != undefined){ //在线列表
- showOnline(message.list);
- }
- }
-
- /**
- * 展示提示信息
- */
- function showNotice(notice){
- $("#chat").append("<div><p class=\"am-text-success\" style=\"text-align:center\"><span class=\"am-icon-bell\"></span> "+notice+"</p></div>");
- var chat = $("#chat-view");
- chat.scrollTop(chat[0].scrollHeight); //让聊天区始终滚动到最下面
- }
-
- /**
- * 展示会话信息
- */
- function showChat(message){
- console.log(message);
- var to = message.to == null || message.to == ""? "全体成员" : message.to; //获取接收人
- var isSef = '${userid}' == message.from ? "am-comment-flip" : ""; //如果是自己则显示在右边,他人信息显示在左边
- var html = "<li class=\"am-comment "+isSef+" am-comment-primary\"><a href=\"#link-to-user-home\"><img width=\"48\" height=\"48\" class=\"am-comment-avatar\" alt=\"\" src=\"${ctx}/static/head/"+message.from+".jpg\"></a><div class=\"am-comment-main\">\n" +
- "<header class=\"am-comment-hd\"><div class=\"am-comment-meta\"> <a class=\"am-comment-author\" href=\"#link-to-user\">"+message.from+"</a> 发表于<time> "+message.time+"</time> 发送给: "+to+" </div></header><div class=\"am-comment-bd\"> <p>"+message.content+"</p></div></div></li>";
- $("#chat").append(html);
- $("#message").val(""); //清空输入区
- var chat = $("#chat-view");
- chat.scrollTop(chat[0].scrollHeight); //让聊天区始终滚动到最下面
- }
-
- /**
- * 展示在线列表
- */
- function showOnline(list){
- $("#list").html(""); //清空在线列表
- $.each(list, function(index, item){ //添加私聊按钮
- var li = "<li>"+item+"</li>";
- if('${userid}' != item){ //排除自己
- li = "<li>"+item+" <button type=\"button\" class=\"am-btn am-btn-xs am-btn-primary am-round\" οnclick=\"addChat('"+item+"');\"><span class=\"am-icon-phone\"><span> 私聊</button></li>";
- }
- $("#list").append(li);
- });
- $("#onlinenum").text($("#list li").length); //获取在线人数
- }
-
- /**
- * 图灵机器人
- * @param message
- */
- function tuling(message){
- var html;
- $.getJSON("http://www.tuling123.com/openapi/api?key=6ad8b4d96861f17d68270216c880d5e3&info=" + message,function(data){
- if(data.code == 100000){
- html = "<li class=\"am-comment am-comment-primary\"><a href=\"#link-to-user-home\"><img width=\"48\" height=\"48\" class=\"am-comment-avatar\" alt=\"\" src=\"${ctx}/static/img/robot.jpg\"></a><div class=\"am-comment-main\">\n" +
- "<header class=\"am-comment-hd\"><div class=\"am-comment-meta\"> <a class=\"am-comment-author\" href=\"#link-to-user\">Robot</a> 发表于<time> "+getDateFull()+"</time> 发送给: ${userid}</div></header><div class=\"am-comment-bd\"> <p>"+data.text+"</p></div></div></li>";
- }
- if(data.code == 200000){
- html = "<li class=\"am-comment am-comment-primary\"><a href=\"#link-to-user-home\"><img width=\"48\" height=\"48\" class=\"am-comment-avatar\" alt=\"\" src=\"${ctx}/static/img/robot.jpg\"></a><div class=\"am-comment-main\">\n" +
- "<header class=\"am-comment-hd\"><div class=\"am-comment-meta\"> <a class=\"am-comment-author\" href=\"#link-to-user\">Robot</a> 发表于<time> "+getDateFull()+"</time> 发送给: ${userid}</div></header><div class=\"am-comment-bd\"> <p>"+data.text+"</p><a href=\""+data.url+"\" target=\"_blank\">"+data.url+"</a></div></div></li>";
- }
- $("#chat").append(html);
- var chat = $("#chat-view");
- chat.scrollTop(chat[0].scrollHeight);
- $("#message").val(""); //清空输入区
- });
- }
Java Websocket服务核心代码:
- package com.amayadream.webchat.websocket;
-
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
-
- import javax.servlet.http.HttpSession;
- import javax.websocket.*;
- import javax.websocket.server.ServerEndpoint;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.concurrent.CopyOnWriteArraySet;
-
- /**
- * websocket服务
- * @author : Ardo
- * @time : 2017.05
- */
- @ServerEndpoint(value = "/chatServer", configurator = HttpSessionConfigurator.class)
- public class ChatServer {
- private static int onlineCount = 0; //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
- private static CopyOnWriteArraySet<ChatServer> webSocketSet = new CopyOnWriteArraySet<ChatServer>();
- private Session session; //与某个客户端的连接会话,需要通过它来给客户端发送数据
- private String userid; //用户名
- private HttpSession httpSession; //request的session
-
- private static List<String> list = new ArrayList<String>(); //在线列表,记录用户名称
- private static Map<String, Object> routetab = new HashMap<String, Object>(); //用户名和websocket的session绑定的路由表
-
- /**
- * 连接建立成功调用的方法
- * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
- */
- @OnOpen
- public void onOpen(Session session, EndpointConfig config){
- //System.out.println("********************ChatServer onOpen************************");
- this.session = session;
- webSocketSet.add(this); //加入set中
- addOnlineCount(); //在线数加1;
- this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
- this.userid=(String) httpSession.getAttribute("userid"); //获取当前用户
- list.add(userid); //将用户名加入在线列表
- routetab.put(userid, session); //将用户名和session绑定到路由表
- String message = getMessage("[" + userid + "]加入聊天室,当前在线人数为"+getOnlineCount()+"位", "notice", list);
- broadcast(message); //广播
- }
-
- /**
- * 连接关闭调用的方法
- */
- @OnClose
- public void onClose(){
- //System.out.println("********************ChatServer onClose************************");
- webSocketSet.remove(this); //从set中删除
- subOnlineCount(); //在线数减1
- list.remove(userid); //从在线列表移除这个用户
- routetab.remove(userid);
- String message = getMessage("[" + userid +"]离开了聊天室,当前在线人数为"+getOnlineCount()+"位", "notice", list);
- broadcast(message); //广播
- }
-
- /**
- * 接收客户端的message,判断是否有接收人而选择进行广播还是指定发送
- * @param _message 客户端发送过来的消息
- */
- @OnMessage
- public void onMessage(String _message) {
- //System.out.println("********************ChatServer onMessage************************");
- JSONObject chat = JSON.parseObject(_message);
- JSONObject message = JSON.parseObject(chat.get("message").toString());
- if(message.get("to") == null || message.get("to").equals("")){ //如果to为空,则广播;如果不为空,则对指定的用户发送消息
- broadcast(_message);
- }else{
- String [] userlist = message.get("to").toString().split(",");
- singleSend(_message, (Session) routetab.get(message.get("from"))); //发送给自己,这个别忘了
- for(String user : userlist){
- if(!user.equals(message.get("from"))){
- singleSend(_message, (Session) routetab.get(user)); //分别发送给每个指定用户
- }
- }
- }
- }
-
- /**
- * 发生错误时调用
- * @param error
- */
- @OnError
- public void onError(Throwable error){
- //System.out.println("********************ChatServer onError************************");
- error.printStackTrace();
- }
-
- /**
- * 广播消息
- * @param message
- */
- public void broadcast(String message){
- //System.out.println("********************ChatServer broadcast************************");
- for(ChatServer chat: webSocketSet){
- try {
- chat.session.getBasicRemote().sendText(message);
- } catch (IOException e) {
- e.printStackTrace();
- continue;
- }
- }
- }
-
- /**
- * 对特定用户发送消息
- * @param message
- * @param session
- */
- public void singleSend(String message, Session session){
- //System.out.println("********************ChatServer singleSend************************");
- try {
- session.getBasicRemote().sendText(message);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 组装返回给前台的消息
- * @param message 交互信息
- * @param type 信息类型
- * @param list 在线列表
- * @return
- */
- public String getMessage(String message, String type, List list){
- //System.out.println("********************ChatServer getMessage************************");
- JSONObject member = new JSONObject();
- member.put("message", message);
- member.put("type", type);
- member.put("list", list);
- return member.toString();
- }
-
- public int getOnlineCount() {
- //System.out.println("********************ChatServer getOnlineCount************************");
- return onlineCount;
- }
-
- public void addOnlineCount() {
- //System.out.println("********************ChatServer addOnlineCount************************");
- ChatServer.onlineCount++;
- }
-
- public void subOnlineCount() {
- //System.out.println("********************ChatServer subOnlineCount************************");
- ChatServer.onlineCount--;
- }
- }
以上为核心代码,需要源码的留下邮箱吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。