經常有小夥伴可以看到一些大型的網站都會有一些客服機器人協助解決問題,今天在這裏用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