经常有小伙伴可以看到一些大型的网站都会有一些客服机器人协助解决问题,今天在这里用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();
}
}
}
总结:
- 代码简单编写的,还有优化的空间,比较服务可以抽出一个父类,部分属性和方法继承即可,没必要写过多浪费代码,而且还有逼格
- 逻辑捋清楚其实不复杂,主要都是流的写入写出和socket链接
- 代码由博主原创,转载请标明出处https://blog.csdn.net/weixin_43968234/article/details/95513730