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();
}
}
}
}