欢迎光临散文网 会员登陆 & 注册

java实现Socket一对多问答型服务器

2022-09-11 07:49 作者:虚云幻仙  | 我要投稿

/**
* 实现一对多问答型服务器
* 一个服务器对多个客户端,与每一个客户端一对一通信
*/

public class QAndAServer1 {
   public static void main(String[] args) {
       try {
           ServerSocket ss = new ServerSocket(8888);
           System.out.println("服务器已启动,等待连接中");
           while (true){
               new AutoAnswer(ss.accept()).start();
               //死循环,不断监听8888端口,每收到一个连接后创建一个自动回复线程来处理,服务器永不关闭
           }
       } catch (IOException 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 InputStreamReader(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);
       }
   }
}

java实现Socket一对多问答型服务器的评论 (共 条)

分享到微博请遵守国家法律