您的位置:首页 > 其它

使用ServerSocket实现自动回复机器人

2017-02-15 14:23 399 查看
先开启Tomcat

Tomcat的开启参考下面链接里的第二步

http://blog.csdn.net/children_of_light/article/details/55004917

开启完Tomcat一定要记得开启服务啊啊 啊啊啊啊啊 啊啊 啊啊



关键代码

写一个简单的方法。实现简单的自动回复

获取msg传值,先做一个简单的if判断语句库,这里只写很简短的例子

public static String getReturnMsg(String msg){
if (msg == null) {
return "";
}
String returnMsg = "" ;
if (msg.contains("在吗")) {
returnMsg = "我傻仔聪全天候在线,亲,摸摸大";
}else if(msg.contains("你多大")){
returnMsg = "长18米,宽1毫米";
}else if(msg.contains("我帅不帅")){
returnMsg = "帅到嗨甘啦";
}else{
returnMsg = "跟你不熟,并抛出一个异常";
}
return returnMsg;
}


接下来的代码则要在客户端获取输入流,并调用上面的方法传回返回值在放在输出流上

/**
* 接受客户端连接请求
* 客户端连上后,发送欢迎
* 客户端发信息,服务端自动回复
* 允许多个客户端连接
*/
public static void test1(){

//生成一个服务端对象,监听本地的8888端口
try {
//服务端
ServerSocket serverSocket = new ServerSocket(8888);
//while(ture)是为了在客户端退出是不直接退出程序,等待下一个客户端的连接

while(true){
//客户端                        //接受一个客户端
Socket socket = serverSocket.accept();
//先发送一个欢迎过去
//获取输出流
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.println("欢饮来到傻仔聪的世界,这里有五毛一斤的葱头出售哦");
pw.flush();//刷新
//获取客户端输入流
InputStream is = socket.getInputStream();
Scanner sc = new Scanner(is);
while (sc.hasNextLine()) {
String msg = "";
msg = sc.nextLine();
//如果客户端发来exit   哈希循环,关闭连接     //忽略大小写。equal相等参数的方法
if (msg.equalsIgnoreCase("exit")) {
System.out.println("断开连接");
break;//跳出哈希循环
}
//调用机械回复方法,传参。msg
String returnMsg = getReturnMsg(msg);
pw.println("商家:" + returnMsg);
pw.flush();
}
pw.close();
is.close();
os.close();
}

//发送完毕
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


写完上面两个方法,我们就可以从Tomcat的服务Run程序就可以从客户端连接进本地服务端,来测试这个简单的自动答复机器人。

因为我们进行的是java的学习,所以用的比较多的是linux,所以可以直接在安装有Tomcat的Linux系统输入命令

Telnet 192.168.xx.xxx 8888

便可以连接服务端

不过我简易下载一个CRT工具来连接

因为在linux下的编码格式和eclipse的编码格式不同,会出现乱码,如果在CRT下,我们可以更改命令行的编码格式,以方便测试



多线程实现多人访问自动回复机器人

怎么样才能让程序想微信啊淘宝客服一样同时允许多个客户端接入呢?

下面就要用到多线程了

改造一下代码,将Test1方法改造成如下代码

/**
* 改造成多线程
* 接受客户端的连接请求吗,当客户端连上后,输出欢饮语句,接受信息,自动回复信息
* 允许多个客户端连接
* @param args
*/
public static void test2(){
// 生成一个服务端对象,监听本地的8888端口
try {
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
// 接收一个客户端的连接
Socket socket = serverSocket.accept();
SocketThread st = new SocketThread(socket);
st.start();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 发送完毕
}
}


上面的方法只负责端口的监视和客户端的连接。

在while循环里我们会调用实现方法

while(ture)是为了在客户端退出是不直接退出程序,等待下一个客户端的连接

新建一个类继承多线程

新建一个类,继承多线程

构造run()方法

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
* 多线程准备
* @author Administrator
*
*/

//创建SocketThread类继承Thread
public class SocketThread extends Thread{

//创建Socket对象
Socket socket = null;
//构造方法
public SocketThread(Socket scoket){
this.socket = socket;
}
//run方法
@Override
public void run() {

//printwriter 获取输出流
PrintWriter pw;
try {
pw = new PrintWriter(socket.getOutputStream());
//输出欢饮语句
pw.println("欢饮来到傻仔聪的世界,这里有五毛一斤的葱头出售哦");
pw.flush();
//scanner获取输入流
Scanner sc = new Scanner(socket.getInputStream());
//哈希 string个msg
while(sc.hasNextLine()){
String msg = sc.nextLine();
//创建 returnsrting 获取数据
String returnMsg = ServerSocketDemo.getReturnMsg(msg);
//print输出
pw.println(returnMsg);
pw.flush();
//判断语句相等就跳出循环
if ("exit".equalsIgnoreCase(msg)) {
break;
}
//关闭服务
sc.close();
pw.close();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: