java簡單問答機器人

https://www.juhe.cn/login?ref=https://www.juhe.cn/ucenter/datacenter
這個網址自己申請一下聚合天氣數據,然後改一下replaythread的key
在這裏插入圖片描述
Client:

package CheatRobort;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Client extends JFrame{
    private String host = "localhost";
    private int port = 19900;
    private Socket socket;
    private JTextField sendText;
    private JTextArea txtarea;
    private String msg;
    JPanel pane = new JPanel();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    /*構造方法*/
    public Client(){
        this.setTitle("問答機器人_客戶端");
        this.setBounds(500,200,650,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        txtarea = new JTextArea(20,50);

        JScrollPane scrollPane = new JScrollPane(txtarea);
        scrollPane.setVisible(true);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        this.add(scrollPane,BorderLayout.CENTER);

        sendText = new JTextField(30);
        JButton sendbtn = new JButton("發送");
        pane.add(sendText);
        pane.add(sendbtn);
        this.add(pane,BorderLayout.SOUTH);

        //初始化msg的值
        msg = txtarea.getText();

        try {
            socket = new Socket(host,port);
            Date date = new Date();
            String time = format.format(date);
            String info = "與服務器建立連接......"+" "+time;
            msg = msg+"\n"+info;
            txtarea.setText(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //註冊監聽器
        sendbtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    ask();
                } catch (IOException e1) {
                    e1.printStackTrace();
                    sendText.setText("");
                }
            }
        });

    }

    public void ask() throws IOException{
        String question = null;
        PrintWriter pw = getWriter(socket);
        BufferedReader br = getReader(socket);

        question = sendText.getText().trim();
        if(question!=null){
            Date date = new Date();
            String time = format.format(date);
            msg = msg+"\n"+"客戶端提問:"+question+" "+time;
            txtarea.setText(msg);
            pw.println(question);

            String reply = br.readLine();
            Date date2 = new Date();
            String time2 = format.format(date2);
            msg = msg+"\n"+"服務器端回覆:"+reply+" "+time2;
            txtarea.setText(msg);
        }
    }

    public PrintWriter getWriter(Socket socket) throws IOException{
        return new PrintWriter(socket.getOutputStream(),true);
    }

    public BufferedReader getReader(Socket socket) throws IOException{
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    public static void main(String []args){
        new Client().setVisible(true);
        Client client = new Client();
    }

}

purenetutil:

package CheatRobort;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * author:dhacker
 * time:2020/4/10 0010 16:08
 */
public class PureNetUtil {
    /**
     * get方法直接調用post方法
     * @param url 網絡地址
     * @return 返回網絡數據
     */
    public static String get(String url){
        return post(url,null);
    }
    /**
     * 設定post方法獲取網絡資源,如果參數爲null,實際上設定爲get方法
     * @param url 網絡地址
     * @param param 請求參數鍵值對
     * @return 返回讀取數據
     */
    public static String post(String url, Map<String, String> param) {
        HttpURLConnection conn = null;
        try {
            URL u = new URL(url);
            conn = (HttpURLConnection) u.openConnection();
            StringBuffer sb = null;
            if (param != null) {// 如果請求參數不爲空
                sb = new StringBuffer();
                /*
                 * A URL connection can be used for input and/or output. Set the
                 * DoOutput flag to true if you intend to use the URL connection
                 * for output, false if not. The default is false.
                 */
                // 默認爲false,post方法需要寫入參數,設定true
                conn.setDoOutput(true);
                // 設定post方法,默認get
                conn.setRequestMethod("POST");
                // 獲得輸出流
                OutputStream out = conn.getOutputStream();
                // 對輸出流封裝成高級輸出流
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
                // 將參數封裝成鍵值對的形式
                for (Map.Entry<String, String> s : param.entrySet()) {
                    sb.append(s.getKey()).append("=").append(s.getValue()).append("&");
                }
                // 將參數通過輸出流寫入
                writer.write(sb.deleteCharAt(sb.toString().length() - 1).toString());
                writer.close();// 一定要關閉,不然可能出現參數不全的錯誤
                sb = null;
            }
            conn.connect();// 建立連接
            sb = new StringBuffer();
            // 獲取連接狀態碼
            int recode = conn.getResponseCode();
            BufferedReader reader = null;
            if (recode == 200) {
                // Returns an input stream that reads from this open connection
                // 從連接中獲取輸入流
                InputStream in = conn.getInputStream();
                // 對輸入流進行封裝
                reader = new BufferedReader(new InputStreamReader(in));
                String str = null;
                sb = new StringBuffer();
                // 從輸入流中讀取數據
                while ((str = reader.readLine()) != null) {
                    sb.append(str).append(System.getProperty("line.separator"));
                }
                // 關閉輸入流
                reader.close();
                if (sb.toString().length() == 0) {
                    return null;
                }
                return sb.toString().substring(0,
                        sb.toString().length() - System.getProperty("line.separator").length());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (conn != null)// 關閉連接
                conn.disconnect();
        }
        return null;
    }

}

replaythread:

package CheatRobort;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Calendar;
import net.sf.json.JSONObject;
/**
 * author:dhacker
 * time:2020/4/10 0010 15:12
 */
public class ReplayThread implements  Runnable {
    private Socket socket;

    public ReplayThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //返回遠程主機地址和端口
            System.out.println("new connection 客戶端 accepted:"+socket.getInetAddress()+" "+socket.getPort());
            BufferedReader br=getReader(socket);
            PrintWriter pw=getWriter(socket);
            String msg=null;
            while ((msg=br.readLine())!=null){
                String s=reply(msg);
                System.out.println(s);
                pw.println(s);
                if("bye".equals(msg))
                    break;
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try{
                if(socket!=null)
                    socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public PrintWriter getWriter(Socket socket) throws IOException {
        return new PrintWriter(socket.getOutputStream(),true);
    }

    public BufferedReader getReader(Socket socket) throws IOException{
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }
    public static String excute(String cityName){
        String url=//此處以返回json格式數據示例,所以format=2,以根據城市名稱爲例,cityName傳入中文
                "http://v.juhe.cn/weather/index?cityname="+cityName+"&key=9f06a1c85ddbb43d9c90784cd85e7332";
        return PureNetUtil.get(url);//通過工具類獲取返回數據
    }
    public static String GetTodayTemperatureByCity(String city) {
        String result=excute(city);
        if(result!=null){
            JSONObject obj=JSONObject.fromObject(result);
            /*獲取返回狀態碼*/
            result=obj.getString("resultcode");
            /*如果狀態碼是200說明返回數據成功*/
            if(result!=null&&result.equals("200")){
                result=obj.getString("result");
                //此時result中數據有多個key,可以對其key進行遍歷,得到對個屬性
                obj=JSONObject.fromObject(result);
                //今日溫度對應的key是today
                result=obj.getString("today");
                obj=JSONObject.fromObject(result);
                //今日溫度對應當key是temperature
                result=obj.getString("temperature");
                return result;
            }
        }
        return result;
    }

    public String reply(String msg){
        int index=msg.indexOf("天氣");
        if("天氣".equals(msg.substring(index,msg.length()))){
            String returnmsg =msg.substring(0,index)+"的今日天氣是:"+GetTodayTemperatureByCity(msg.substring(0,index));
            return returnmsg;
        }
        else if("出行".equals(msg)){
            //獲取系統日期的星期幾?
            String info = null;
            int day = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
            System.out.println("day = " + day); //6
            switch (day){
                case Calendar.MONDAY:
                    info =  "今天週一,車牌尾號限行1和6";
                    break;
                case Calendar.TUESDAY:
                    info = "今天週二,車牌尾號限行2和7";
                    break;
                case Calendar.WEDNESDAY:
                    info =  "今天週三,車牌尾號限行3和8";
                    break;
                case Calendar.THURSDAY:
                    info =  "今天週四,車牌尾號限行4和9";
                    break;
                case Calendar.FRIDAY:
                    info =  "今天週五,車牌尾號限行2和7";
                    break;
                case Calendar.SATURDAY:

                case Calendar.SUNDAY:
                    info =  "今天週末,不限行";
                    break;
                default:
                    info =  "不限行";

            }
            return info;

        }
        else if("bye".equals(msg))
            return "程序即將退出……";
        else
            return "未知信息";
    }
}

server:

package CheatRobort;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Server {
    private int port = 19900;
    private ServerSocket serverSocket;
    private final static  int POOL_SIZE=5;
    private ExecutorService executorService;

    public static void main(String[] args) {
        Server server = new Server();
        server.service();
    }
    /**
     * 構造方法,創建ServerSocket對象
     */
    public Server(){
        try {
            serverSocket = new ServerSocket(port,5);
            System.out.println("cpu內核數:"+Runtime.getRuntime().availableProcessors());
            //內核數乘以線程數
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
            System.out.println("服務器已啓動……");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    /**
     * 服務器處理客戶請求的方法
     */
    public void service(){
        while (true){
            Socket socket = null;
            try{
                //從服務器的等候隊列中取出一個socket與客戶端進行交互
                socket = serverSocket.accept();
                //單線程 耗時
//                Thread thread=new Thread(new ReplayThread(socket));
//                thread.start();
                //線程池 切換線程
                executorService.execute(new ReplayThread(socket));
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }



}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章