/**
* 实现一对多问答型服务器
* 一个服务器对多个客户端,与每一个客户端一对一通信
*/
public class QAndAServer1 {
public static void main(String[] args) {
try {
Server socket ss = new ServerSocket(8888);
System.out.println(“服务器已启动,等待连接中”);
while (true){
new AutoAnswer(ss.accept()).start();
//死循环,不断监听8888端口,每收到一个连接后创建一个自动回复线程来处理,服务器永不关闭
}
} catch (IO Exception e) {
throw new RuntimeException(e);
}
}
}
class AutoAnswer extends Thread{
final private Socket socket;
public AutoAnswer(Socket socket) {
this.socket = socket;
//服务器将每一个客户端的连接传入一个新的 线程 对象中
}
public static String answerOf(String question){
if (question.matches(“.*([你好]|ni|hao|hello|hi|[在吗]|亲|[有人吗]|[早中晚上]).*”)){
return “你好啊”;
}
if (question.matches(“.*[吃了吗什么的].*”)) {
return “我没吃,你呢”;
}
if (question.matches(“.*[问题?请?怎么办].*”)) {
return “这边会为您进行反馈,请耐心等待结果”;
}
if (question.matches(“.*[bye再见退出Exit关闭].*”)){
return “”;
}
return “我不懂你的意思,请再说一遍”;
}
@Override
public void run() {
try(PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStream Reader(socket.getInputStream()))) {
System.out.println(“收到客户端”+socket.getInetAddress()+”的连接,通信已开始”);
pw.println(“您好,人工智障”+this.getName().split(“-“)[1]+”号机为您服务,您请说: “);
//线程默认名字为 Thread -数字,用-分割取1位为数字
while (true){
String answer = answerOf(br.readLine());
if (“”.equals(answer)){
pw.println(“再见~”);
break;
}
pw.println(answer);
}
System.out.println(“与客户端”+socket.getInetAddress()+”的通信结束”);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
socket.close();
//在线程内将连接关闭
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}