利用Socket实现客服机器人对话

经常有小伙伴可以看到一些大型的网站都会有一些客服机器人协助解决问题,今天在这里用Socket实现了一个简易的对话功能,感兴趣的小伙伴们可以往下看。

先来看一下演示结果吧~

客户端

启动后打印如下信息,这个时候可以在控制输入1,2,3来选择机器人小莉的问题解答
在这里插入图片描述

小莉?你以为是下面这个⬇️
在这里插入图片描述

不不不,小莉是给机器人起的名字,哈哈哈。。。
扯远了。。。

下面看下属于指令之后的情况:
在这里插入图片描述
输入完全
在这里插入图片描述

服务端

在这里插入图片描述


说到这里,小伙伴是不是对如何实现的比较好奇呢
ok,如果捋清楚之间的逻辑,代码实现起来还是比较简单的

第一步 建立Socket链接 (客户端 <----> 服务端
第二步 客户端向服务端发送请求 (客户端 ----> 服务端
第三步 服务端监听接受到请求后,处理请求信息,并响应给客户端 (客户端 <---- 服务端
第四步 客户端接受数据 (客户端


一起来看下代码实现吧~~

1. 服务端

在这里插入图片描述

1.1 服务端处理消息内容核心代码:
package com.yh.hchatserver.robot;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.UUID;

/**
 * @author yanghao
 * @version RobotServer.java, v 0.1 2019-07-11 14:11
 */
public class RobotServer implements Runnable{

    /**
     * Socket
     */
    private Socket server;

    /**
     * 编号
     */
    private String id;

    /**
     * 名称
     */
    private String name;

    private DataOutputStream out;
    private DataInputStream in;


    /**
     * 构造器
     * @param server
     */
    public RobotServer(Socket server){
        this.id = UUID.randomUUID().toString();
        this.name = "小莉";
        this.server = server;
    }

    @Override
    public void run() {
        try {
            //初始化连接反馈信息
            out = new DataOutputStream(server.getOutputStream());
            String initMsg = buildInitMsg();
            out.writeUTF(initMsg);

            //接受客户端的信息
            String msg = "";

            while (true){
                //接受消息
                in = new DataInputStream(server.getInputStream());
                msg = in.readUTF();
                System.out.println(msg);

                //反馈消息
                String resp = Answer(msg);
                out = new DataOutputStream(server.getOutputStream());
                out.writeUTF(resp);

            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * 初始化信息
     * @return
     */
    private String buildInitMsg() {
        StringBuffer sb = new StringBuffer();
        sb.append("欢迎使用XX机器人客服,我是" + this.name + "(编号:" + this.id + "),很高兴为您服务!\n")
          .append("1. 天气如何?\n")
          .append("2. 哪里好玩?\n")
          .append("3. 乘车线路?");

        return sb.toString();

    }

    /**
     * 处理请求消息
     * @param msg
     * @return
     */
    private String Answer(String msg) {
        String resp = "";

        if("1".equals(msg)){
            resp = "今天晴 32度";

        }else if("2".equals(msg)){
            resp = "西湖";

        }else if("3".equals(msg)){
            resp = "乘地铁到龙翔桥站,再步行400米";

        }else{
            resp = "选择错误!";

        }

        return resp;
    }
}
1.2 启动类:
package com.yh.hchatserver.main;

import com.yh.hchatserver.robot.RobotServer;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author yanghao
 * @version ServerMain.java, v 0.1 2019-07-11 12:02
 */
public class ServerMain {

    public static void main(String[] args) {
        //监听端口
        int port = 8080;

        //启动监听线程
        ServerSocket listener = null;
        try {
            listener = new ServerSocket(port);
            System.out.println("===========================");
            System.out.println("机器人服务已启动...");
            System.out.println("===========================");

            while (true) {
                Socket server = listener.accept();
                Runnable r = new RobotServer(server);
                new Thread(r).start();
            }
        } catch (IOException c) {
            c.printStackTrace();
        } finally {
            try {
                listener.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


2. 客户端

在这里插入图片描述

2.1 发送信息服务代码
package com.yh.hchatclient.server;

import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author yanghao
 * @version SendServer.java, v 0.1 2019-07-11 14:30
 */
public class SendServer implements Runnable {

    /**
     * Socket
     */
    private Socket server;

    private DataOutputStream out;

    /**
     * 构造器
     * @param server
     */
    public SendServer(Socket server){
        this.server = server;
    }

    @Override
    public void run() {
        try {
            Scanner scanner = new Scanner(System.in);
            String msg = "";

            while (true){
                if(scanner.hasNext()){
                    //获取客户端信息
                    msg = scanner.nextLine();

                    //发送至服务端
                    out = new DataOutputStream(server.getOutputStream());
                    out.writeUTF(msg);

                }

            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}
2.2 接受消息服务代码
package com.yh.hchatclient.server;

import java.io.DataInputStream;
import java.net.Socket;

/**
 * @author yanghao
 * @version ReadServer.java, v 0.1 2019-07-11 14:31
 */
public class ReadServer implements Runnable {

    /**
     * Socket
     */
    private Socket server;

    private DataInputStream in;

    /**
     * 构造器
     * @param server
     */
    public ReadServer(Socket server){
        this.server = server;
    }

    @Override
    public void run() {
        try {
            String msg = "";

            while (true){

                in = new DataInputStream(server.getInputStream());
                msg = in.readUTF();
                System.out.println(msg);
                System.out.println("---------------------------");

            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}
2.3 启动类
package com.yh.hchatclient.main;

import com.yh.hchatclient.server.ReadServer;
import com.yh.hchatclient.server.SendServer;
import lombok.extern.slf4j.Slf4j;

import java.net.Socket;

/**
 * @author yanghao
 * @version ClientMain.java, v 0.1 2019-07-11 14:27
 */
public class ClientMain {

    public static void main(String[] args) {

        try {
            //Socket链接
            Socket server = new Socket("127.0.0.1",8080);

            //启动发送服务
            Thread send = new Thread(new SendServer(server));
            System.out.println("===========================");
            System.out.println("发送服务已启动...");
            send.start();

            //启动读服务
            Thread read = new Thread(new ReadServer(server));
            System.out.println("读服务已启动...");
            System.out.println("===========================");
            read.start();


        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

总结:

  1. 代码简单编写的,还有优化的空间,比较服务可以抽出一个父类,部分属性和方法继承即可,没必要写过多浪费代码,而且还有逼格
  2. 逻辑捋清楚其实不复杂,主要都是流的写入写出和socket链接
  3. 代码由博主原创,转载请标明出处https://blog.csdn.net/weixin_43968234/article/details/95513730
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个旺旺客服机器人程序 网上下载的源代码修改而成,原来需要注册没用的控件,给去了 等有时间重新写个再完美一些的出来 下面是使用说明 一、运行环境 OS:WinsowXP/Vista/7(需要管理员权限) 硬件:建议可用内存不低于1GB,空闲时CPU占用率不高于10% 软件:以开启淘宝旺旺和网页不觉得卡、迟钝即可 二、使用条件 1.【必须】只能在阿里旺旺2012卖家版环境下使用 2.【建议】关闭关闭E客服功能 3.【必须】一定要关闭工作台模 4. 【必须】将发送信息设置为Enter(回车键)发送,而不是Enter+Ctrl 5.【建议】关闭自动升级功能 6.【必须】关闭所有自动回复功能 7.【必须】开启机器人任何时候均不得进入暂离、勿扰等模式 8.【必须】取消“不使用电脑XX分钟后进入离开模"式 9.【建议】关闭后台一切不必要软件,特别是P2P软件和大量占用CPU内存等资源的程,机器越卡约可能出现意外 10.【建议】关闭消息提醒所有浮出效果 11.【必须】开启机器人后请勿使用旺旺主动与其他任何人发起聊天,请勿对电脑有任何操作 12.【必须】关闭屏幕保护程序,关闭待机功能,一旦进入待机状态程序将停止 13.【强烈建议】关闭后台一切占用系统资源的程序:如游戏、MP3、视频、下载器等 14.【特别注意】自动回复提问和回答文字中不得含有“\"符号,网址应用"/"代替,如:http://www.baidu.com/index.html 三、常见问题 1.出现自动回复错误 由于机器人是采用模糊判断,假如回复内容为:在吗/在的,则所有回答含有"在吗“的所有提问都会被回答为:在的。 2.出现多句回复或短时间多次提问无法回复 当前版本机器人只擅长回复单句提问,无法适应短时间客户大量提出问题。建议在回复时提示用户提问速度放慢,使用简单易懂的单句 3.经常出现回复”无法识别“ 出现此类问题往往是用户发送图片、文件或者输入错别字或者没有设定符合条件的自动回复语句造成的 4.出现无回复窗口即消失等问题 请保证您的电脑能够流畅运行,本机器人不适合老爷机使用,系统越卡则出现此类问题几率越大 5.其他问题 请检查确保您的电脑已经符合运行环境且已经按照使用条件设置 四、使用技巧、方法 1.先启动旺旺2012卖家版 2.按照第二章节[使用条件]认真设置检查无误后开启本机器人 3.选钩”接受协议“,设置填写您的淘宝ID(即:您店铺中显示联系我所显示的ID名字),填写错误将导致机器人无法运行 4.添加删除设置问题、回答,完成后点击保存 5.关闭清理释放后台程序,将一切占用内存的程序统统退出 6.关闭所有旺旺聊天框,最小化旺旺2012卖家版 7.点击机器人界面”启动“即可,鼠标键盘不再任何操作 技巧提示: 1.出现任何问题请勿急躁,请认真检查使用步骤、必须条件是否满足,仔细阅读本帮助文档 2.检查软件设置是否错误,是否符合要求 3.如果您找不到阿里旺旺2012卖家版的设置在哪,不明白第二章内容所指的设置在何处请点开旺旺2012卖家版界面,点击左下角”设置“,在出来的界面中细心查找 4.如果您找不到阿里旺旺2012卖家版请到此网址下载: http://www.onlinedown.net/soft/50032.htm [华军软件园] 5.免费软件,如果您想修改自动回复内容请联系597635593@qq.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值