From 9839ac76cb4b648641fffad33f92413391196fdd Mon Sep 17 00:00:00 2001 From: dipoo <120826531@qq.com> Date: Wed, 23 Mar 2016 13:47:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/impl/SettingDom4jDbTemplate.java | 14 ++ src/org/arong/egdownloader/model/Setting.java | 40 +++++ src/org/arong/egdownloader/spider/Proxy.java | 140 ++++++++++++++++++ .../arong/egdownloader/spider/WebClient.java | 86 +++++++++-- .../egdownloader/ui/SwingPrintStream.java | 4 +- .../egdownloader/ui/table/TaskingTable.java | 4 +- .../ui/window/EgDownloaderWindow.java | 3 + .../egdownloader/ui/window/InitWindow.java | 24 +-- .../egdownloader/ui/window/SettingWindow.java | 73 ++++++++- .../ui/window/TestProxyWindow.java | 112 ++++++++++++++ .../egdownloader/ui/work/DownloadWorker.java | 10 +- src/org/arong/util/CodeUtil.java | 129 ++++++++++++++++ 12 files changed, 614 insertions(+), 25 deletions(-) create mode 100644 src/org/arong/egdownloader/spider/Proxy.java create mode 100644 src/org/arong/egdownloader/ui/window/TestProxyWindow.java create mode 100644 src/org/arong/util/CodeUtil.java diff --git a/src/org/arong/egdownloader/db/impl/SettingDom4jDbTemplate.java b/src/org/arong/egdownloader/db/impl/SettingDom4jDbTemplate.java index e1561bc..71c13ac 100644 --- a/src/org/arong/egdownloader/db/impl/SettingDom4jDbTemplate.java +++ b/src/org/arong/egdownloader/db/impl/SettingDom4jDbTemplate.java @@ -8,9 +8,11 @@ import java.util.ArrayList; import java.util.List; +import org.apache.commons.codec.binary.Base64; import org.arong.egdownloader.db.DbTemplate; import org.arong.egdownloader.model.Setting; import org.arong.egdownloader.ui.ComponentConst; +import org.arong.util.CodeUtil; import org.arong.util.Dom4jUtil; import org.arong.util.FileUtil; import org.dom4j.Document; @@ -218,6 +220,12 @@ private Element setting2Element(Setting t) { ele.addAttribute("collectPictureScriptPath", t.getCollectPictureScriptPath()); ele.addAttribute("downloadScriptPath", t.getDownloadScriptPath()); ele.addAttribute("searchScriptPath", t.getSearchScriptPath()); + + ele.addAttribute("useProxy", t.isUseProxy() + ""); + ele.addAttribute("proxyIp", t.getProxyIp()); + ele.addAttribute("proxyPort", t.getProxyPort()); + ele.addAttribute("proxyUsername", t.getProxyUsername()); + ele.addAttribute("proxyPwd", CodeUtil.myEncode(t.getProxyPwd())); return ele; } private Setting node2Setting(Node node) { @@ -282,6 +290,12 @@ private Setting node2Setting(Node node) { t.setCollectPictureScriptPath(ele.attributeValue("collectPictureScriptPath") == null ? t.getCollectPictureScriptPath() : ele.attributeValue("collectPictureScriptPath")); t.setDownloadScriptPath(ele.attributeValue("downloadScriptPath") == null ? t.getDownloadScriptPath() : ele.attributeValue("downloadScriptPath")); t.setSearchScriptPath(ele.attributeValue("searchScriptPath") == null ? t.getSearchScriptPath() : ele.attributeValue("searchScriptPath")); + + t.setUseProxy("true".equals(ele.attributeValue("useProxy")) ? true : false); + t.setProxyIp(ele.attributeValue("proxyIp")); + t.setProxyPort(ele.attributeValue("proxyPort")); + t.setProxyUsername(ele.attributeValue("proxyUsername")); + t.setProxyPwd(CodeUtil.myDecode(ele.attributeValue("proxyPwd"))); return t; } diff --git a/src/org/arong/egdownloader/model/Setting.java b/src/org/arong/egdownloader/model/Setting.java index 2198c0a..036caa7 100644 --- a/src/org/arong/egdownloader/model/Setting.java +++ b/src/org/arong/egdownloader/model/Setting.java @@ -65,6 +65,16 @@ public class Setting { private String lastDownloadTime;//最后下载时间 private String lastCreateTime;//最后创建时间 + /** + * 代理 + */ + private boolean useProxy = false;//是否使用代理 + private String proxyIp;//代理ip + private String proxyPort;//代理端口 + private String proxyUsername;//代理用户名 + private String proxyPwd;//代理密码 + + public String[] getTask_name() { return task_name; @@ -342,4 +352,34 @@ public void setUpdateScriptWorker(UpdateScriptWorker updateScriptWorker) { public UpdateScriptWorker getUpdateScriptWorker() { return updateScriptWorker; } + public boolean isUseProxy() { + return useProxy; + } + public void setUseProxy(boolean useProxy) { + this.useProxy = useProxy; + } + public String getProxyIp() { + return proxyIp; + } + public void setProxyIp(String proxyIp) { + this.proxyIp = proxyIp; + } + public String getProxyPort() { + return proxyPort; + } + public void setProxyPort(String proxyPort) { + this.proxyPort = proxyPort; + } + public String getProxyUsername() { + return proxyUsername; + } + public void setProxyUsername(String proxyUsername) { + this.proxyUsername = proxyUsername; + } + public String getProxyPwd() { + return proxyPwd; + } + public void setProxyPwd(String proxyPwd) { + this.proxyPwd = proxyPwd; + } } diff --git a/src/org/arong/egdownloader/spider/Proxy.java b/src/org/arong/egdownloader/spider/Proxy.java new file mode 100644 index 0000000..392b9bd --- /dev/null +++ b/src/org/arong/egdownloader/spider/Proxy.java @@ -0,0 +1,140 @@ +package org.arong.egdownloader.spider; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.URL; +import java.net.URLConnection; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.UsernamePasswordCredentials; +import org.apache.commons.httpclient.auth.AuthScope; +/** + * 代理 + * @author dipoo + * @since 2016-03-22 + */ +public class Proxy { + public static boolean useProxy; + public static String ip; + public static String port; + public static String username; + public static String pwd; + + public static void init(boolean useProxy_, String ip_, String port_, String username_, String pwd_){ + useProxy = useProxy_; + ip = ip_; + port = port_; + username = username_; + pwd = pwd_; + //proxy(); + } + + /** + * jvm全局使用代理 + */ + public static void proxy(){ + if(useProxy){ + System.setProperty("http.maxRedirects", "50"); + System.getProperties().setProperty("proxySet", "true"); + System.getProperties().setProperty("http.proxyHost", ip); + System.getProperties().setProperty("http.proxyPort", port); + }else{ + System.getProperties().setProperty("proxySet", "false"); + System.getProperties().setProperty("http.proxyHost", ""); + System.getProperties().setProperty("http.proxyPort", ""); + } + } + + /** + * 取消jvm全局代理 + */ + public static void unproxy(){ + if(!useProxy){ + System.getProperties().setProperty("proxySet", "false"); + } + } + + public static HttpClient getHttpClient(){ + HttpClient httpClient = new HttpClient(); + if(useProxy){ + //设置代理服务器的ip地址和端口 + httpClient.getHostConfiguration().setProxy(ip, Integer.parseInt(port)); + //使用抢先认证 + httpClient.getParams().setAuthenticationPreemptive(true); + //如果代理需要密码验证,这里设置用户名密码 + if(username != null && pwd != null){ + httpClient.getState().setProxyCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, pwd)); + } + } + return httpClient; + } + + public static java.net.Proxy getNetProxy(){ + if(useProxy){ + return new java.net.Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(ip, Integer.parseInt(port))); + } + return null; + } + + public static void main(String[] args) throws IOException { + System.setProperty("http.maxRedirects", "50"); + System.getProperties().setProperty("proxySet", "true"); + // 如果不设置,只要代理IP和代理端口正确,此项不设置也可以 + String ip = "127.0.0.1"; + /*ip = "221.130.18.5"; + ip = "221.130.23.135"; + ip = "221.130.18.78"; + ip = "221.130.23.134"; + ip = "221.130.18.49"; + ip = "111.1.32.36"; + ip = "221.130.18.49"; + ip = "221.130.18.49";*/ + System.getProperties().setProperty("http.proxyHost", ip); + System.getProperties().setProperty("http.proxyPort", "22900"); + + //确定代理是否设置成功 + System.out.println(getHtml("http://1212.ip138.com/ic.asp")); + + } + + private static String getHtml(String address){ + StringBuffer html = new StringBuffer(); + String result = null; + try{ + URL url = new URL(address); + URLConnection conn = url.openConnection(); + conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 7.0; NT 5.1; GTB5; .NET CLR 2.0.50727; CIBA)"); + BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); + + try{ + String inputLine; + byte[] buf = new byte[4096]; + int bytesRead = 0; + while (bytesRead >= 0) { + inputLine = new String(buf, 0, bytesRead, "ISO-8859-1"); + html.append(inputLine); + bytesRead = in.read(buf); + inputLine = null; + } + buf = null; + }finally{ + in.close(); + conn = null; + url = null; + } + result = new String(html.toString().trim().getBytes("ISO-8859-1"), "gb2312").toLowerCase(); + + }catch (Exception e) { + e.printStackTrace(); + return null; + }finally{ + html = null; + } + return result; + } + + public boolean isUseProxy() { + return useProxy; + } +} diff --git a/src/org/arong/egdownloader/spider/WebClient.java b/src/org/arong/egdownloader/spider/WebClient.java index 698f4ad..ecf31a1 100644 --- a/src/org/arong/egdownloader/spider/WebClient.java +++ b/src/org/arong/egdownloader/spider/WebClient.java @@ -18,6 +18,7 @@ import java.util.Map.Entry; import java.util.Set; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.httpclient.ConnectTimeoutException; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; @@ -25,6 +26,7 @@ import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.params.HttpMethodParams; /** * 获取远程url地址页面的源文件 @@ -63,7 +65,7 @@ public static String postRequestWithCookie(String url, String cookieInfo) throws * @throws SocketTimeoutException */ public static String postRequestWithCookie(String url, String encoding, Map rawParams, String cookieInfo) throws WebClientException, ConnectTimeoutException, SocketTimeoutException { - HttpClient httpClient = new HttpClient(); + HttpClient httpClient = Proxy.getHttpClient(); // 创建HttpPost对象。 PostMethod postMethod = new PostMethod(url); postMethod.setDoAuthentication(true); @@ -98,6 +100,7 @@ public static String postRequestWithCookie(String url, String encoding, Map rawParams, String cookieInfo) throws WebClientException, ConnectTimeoutException, SocketTimeoutException { - HttpClient httpClient = new HttpClient(); + HttpClient httpClient = Proxy.getHttpClient(); // 创建HttpPost对象。 PostMethod postMethod = new PostMethod(url); postMethod.setDoAuthentication(true); @@ -244,7 +247,7 @@ public static InputStream postRequestAsStreamWithCookie(String url, String cooki * @throws SocketTimeoutException */ public static InputStream postRequestAsStreamWithCookie(String url, String encoding, Map rawParams, String cookieInfo) throws WebClientException, ConnectTimeoutException, SocketTimeoutException { - HttpClient httpClient = new HttpClient(); + HttpClient httpClient = Proxy.getHttpClient(); // 创建HttpPost对象。 PostMethod postMethod = new PostMethod(url); postMethod.setDoAuthentication(true); @@ -318,8 +321,21 @@ public static InputStream getStreamUseJava(final String urlString) try{ do { - HttpURLConnection urlConnection = (HttpURLConnection) url - .openConnection(); + HttpURLConnection urlConnection = null; + if(Proxy.getNetProxy() != null){ + urlConnection = (HttpURLConnection) url + .openConnection(Proxy.getNetProxy()); + if(Proxy.username != null && Proxy.pwd != null){ + //格式如下: + //"Proxy-Authorization"= "Basic Base64.encode(user:password)" + String headerKey = "Proxy-Authorization"; + String headerValue = "Basic " + Base64.encodeBase64((Proxy.username+":"+Proxy.pwd).getBytes()); + urlConnection.setRequestProperty(headerKey, headerValue); + } + }else{ + urlConnection = (HttpURLConnection) url + .openConnection(); + } // 添加访问授权 if (digest != null) { urlConnection.setRequestProperty("Authorization", digest); @@ -332,7 +348,7 @@ public static InputStream getStreamUseJava(final String urlString) urlConnection.setConnectTimeout(20000); urlConnection.setReadTimeout(20000); //模拟http头文件 - urlConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0;)"); + urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"); urlConnection.setRequestProperty("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*"); //追加http头文件 Set> headersSet = headers.entrySet(); @@ -357,6 +373,27 @@ public static InputStream getStreamUseJava(final String urlString) } else { if (responseCode == 200 || responseCode == 201) { inputStream = urlConnection.getInputStream(); + }else{ + // 获得返回的数据长度 + int responseLength = urlConnection.getContentLength(); + BufferedInputStream in; + if (responseCode == 200 || responseCode == 201) { + in = new BufferedInputStream(urlConnection.getInputStream()); + } else { + in = new BufferedInputStream(urlConnection.getErrorStream()); + } + int size = responseLength == -1 ? 4096 : responseLength; + String responseContent = null; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] bytes = new byte[size]; + int read; + while ((read = in.read(bytes)) >= 0) { + out.write(bytes, 0, read); + } + responseContent = new String(out.toByteArray()); + in.close(); + out.close(); + System.out.println(responseContent); } foundRedirect = false; } @@ -404,9 +441,23 @@ public static String getRequestUseJava(final String urlString, try{ do { - - HttpURLConnection urlConnection = (HttpURLConnection) url - .openConnection(); + + HttpURLConnection urlConnection = null; + if(Proxy.getNetProxy() != null){ + urlConnection = (HttpURLConnection) url + .openConnection(Proxy.getNetProxy()); + if(Proxy.username != null && Proxy.pwd != null){ + //格式如下: + //"Proxy-Authorization"= "Basic Base64.encode(user:password)" + String headerKey = "Proxy-Authorization"; + String headerValue = "Basic " + Base64.encodeBase64((Proxy.username+":"+Proxy.pwd).getBytes()); + urlConnection.setRequestProperty(headerKey, headerValue); + } + }else{ + urlConnection = (HttpURLConnection) url + .openConnection(); + } + // 添加访问授权 if (digest != null) { urlConnection.setRequestProperty("Authorization", digest); @@ -503,8 +554,21 @@ public static String getCookieUseJava(final String urlString, try{ do { - HttpURLConnection urlConnection = (HttpURLConnection) url - .openConnection(); + HttpURLConnection urlConnection = null; + if(Proxy.getNetProxy() != null){ + urlConnection = (HttpURLConnection) url + .openConnection(Proxy.getNetProxy()); + if(Proxy.username != null && Proxy.pwd != null){ + //格式如下: + //"Proxy-Authorization"= "Basic Base64.encode(user:password)" + String headerKey = "Proxy-Authorization"; + String headerValue = "Basic " + Base64.encodeBase64((Proxy.username+":"+Proxy.pwd).getBytes()); + urlConnection.setRequestProperty(headerKey, headerValue); + } + }else{ + urlConnection = (HttpURLConnection) url + .openConnection(); + } // 添加访问授权 if (digest != null) { urlConnection.setRequestProperty("Authorization", digest); diff --git a/src/org/arong/egdownloader/ui/SwingPrintStream.java b/src/org/arong/egdownloader/ui/SwingPrintStream.java index b39ea88..2116ad5 100644 --- a/src/org/arong/egdownloader/ui/SwingPrintStream.java +++ b/src/org/arong/egdownloader/ui/SwingPrintStream.java @@ -38,8 +38,8 @@ public void write(byte[] buf, int off, int len) { */ private void filter(JTextArea logTextArea){ String text = logTextArea.getText(); - if(text.length() > 5000){ - logTextArea.setText(text.substring(text.length() - 5000, text.length())); + if(text.length() > 1000){ + logTextArea.setText(text.substring(text.length() - 1000, text.length())); } } diff --git a/src/org/arong/egdownloader/ui/table/TaskingTable.java b/src/org/arong/egdownloader/ui/table/TaskingTable.java index a3c36be..28a4f26 100644 --- a/src/org/arong/egdownloader/ui/table/TaskingTable.java +++ b/src/org/arong/egdownloader/ui/table/TaskingTable.java @@ -314,7 +314,9 @@ public void propertyChange(PropertyChangeEvent evt) { public void run() { if(table.isRefresh()){ //刷新表格 - SwingUtilities.updateComponentTreeUI(table); + try{ + SwingUtilities.updateComponentTreeUI(table); + }catch(Exception e){} table.setRefresh(false); } } diff --git a/src/org/arong/egdownloader/ui/window/EgDownloaderWindow.java b/src/org/arong/egdownloader/ui/window/EgDownloaderWindow.java index d712fa8..dcaa02d 100644 --- a/src/org/arong/egdownloader/ui/window/EgDownloaderWindow.java +++ b/src/org/arong/egdownloader/ui/window/EgDownloaderWindow.java @@ -52,6 +52,7 @@ import org.arong.egdownloader.model.Task; import org.arong.egdownloader.model.TaskList; import org.arong.egdownloader.model.TaskStatus; +import org.arong.egdownloader.spider.Proxy; import org.arong.egdownloader.ui.ComponentConst; import org.arong.egdownloader.ui.ComponentUtil; import org.arong.egdownloader.ui.IconManager; @@ -148,6 +149,8 @@ public EgDownloaderWindow(Setting setting, TaskList tasks, DbTemplate() : tasks; // 设置主窗口 diff --git a/src/org/arong/egdownloader/ui/window/InitWindow.java b/src/org/arong/egdownloader/ui/window/InitWindow.java index 1c1de82..015ac36 100644 --- a/src/org/arong/egdownloader/ui/window/InitWindow.java +++ b/src/org/arong/egdownloader/ui/window/InitWindow.java @@ -15,6 +15,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JWindow; +import javax.swing.SwingUtilities; import org.apache.commons.httpclient.ConnectTimeoutException; import org.arong.egdownloader.db.DbTemplate; @@ -164,15 +165,20 @@ public int compare(Task o1, Task o2) { //启动主界面 public void startMain(){ - if(ComponentConst.mainWindow != null){ - //暂停所有任务 - ((TaskingTable)ComponentConst.mainWindow.runningTable).stopAllTasks(); - ComponentConst.mainWindow.changeTaskGroup(setting, tasks, taskDbTemplate, pictureDbTemplate, settingDbTemplate); - }else{ - ComponentConst.mainWindow = new EgDownloaderWindow(setting, tasks, taskDbTemplate, pictureDbTemplate, settingDbTemplate); - } - textLabel.setText("初始化完成"); - ComponentConst.mainWindow.setVisible(true); this.dispose();//释放此窗口占用的资源,否则会消耗大量CPU + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if(ComponentConst.mainWindow != null){ + //暂停所有任务 + ((TaskingTable)ComponentConst.mainWindow.runningTable).stopAllTasks(); + ComponentConst.mainWindow.changeTaskGroup(setting, tasks, taskDbTemplate, pictureDbTemplate, settingDbTemplate); + }else{ + ComponentConst.mainWindow = new EgDownloaderWindow(setting, tasks, taskDbTemplate, pictureDbTemplate, settingDbTemplate); + } + textLabel.setText("初始化完成"); + ComponentConst.mainWindow.setVisible(true); + } + }); + } } diff --git a/src/org/arong/egdownloader/ui/window/SettingWindow.java b/src/org/arong/egdownloader/ui/window/SettingWindow.java index e28b645..f3192d0 100644 --- a/src/org/arong/egdownloader/ui/window/SettingWindow.java +++ b/src/org/arong/egdownloader/ui/window/SettingWindow.java @@ -11,18 +11,22 @@ import java.util.regex.Pattern; import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JTextPane; import org.arong.egdownloader.model.Setting; +import org.arong.egdownloader.spider.Proxy; import org.arong.egdownloader.ui.ComponentConst; import org.arong.egdownloader.ui.IconManager; import org.arong.egdownloader.ui.listener.MouseAction; @@ -47,6 +51,7 @@ public class SettingWindow extends JFrame{ JTabbedPane settingTabPanel = new JTabbedPane(JTabbedPane.LEFT); public LoginWindow loginWindow; public TestScriptWindow testScriptWindow; + public TestProxyWindow testProxyWindow; /* 基本配置页签 */ JPanel basicPanel; JLabel saveDirLabel; @@ -82,6 +87,22 @@ public class SettingWindow extends JFrame{ public JLabel loadingLabel; public JTextPane scriptDocPanel; + /* 代理设置 */ + JPanel proxyPanel; + public JLabel proxyLabel; + public ButtonGroup proxyButtonGroup; + public JRadioButton noRadioButton; + public JRadioButton yesRadioButton; + public JLabel proxyIpLabel; + public JTextField proxyIpField; + public JLabel proxyPortLabel; + public JTextField proxyPortField; + public JLabel proxyUsernameLabel; + public JTextField proxyUsernameField; + public JLabel proxyPwdLabel; + public JPasswordField proxyPwdField; + public JButton proxyTestBtn; + Color labelColor = new Color(65,145,65); Color bgColor = new Color(210,225,240); @@ -108,7 +129,6 @@ public SettingWindow(JFrame mainWindow) { settingTabPanel.setBounds(20, 0, 780, 450); - /* 基本配置 */ basicPanel = new JPanel(); basicPanel.setLayout(null); @@ -244,8 +264,42 @@ public void doWork(Window window, MouseEvent e) { addComponentsJpanel(scriptPanel, createJsLabel, createJsField, collectJsLabel, collectJsField, downloadJsLabel, downloadJsField, searchJsLabel, searchJsField, openScriptDirBtn, testBtn, updateBtn, loadingLabel, scriptDocPanel); + /* 代理配置 */ + proxyPanel = new JPanel(); + proxyPanel.setLayout(null); + proxyButtonGroup = new ButtonGroup(); + proxyLabel = new AJLabel("是否使用代理:", labelColor, 25, 30, 100, 30); + noRadioButton = new JRadioButton("不使用", !setting.isUseProxy()); + noRadioButton.setBounds(125, 30, 80, 30); + yesRadioButton = new JRadioButton("使用", setting.isUseProxy()); + yesRadioButton.setBounds(230, 30, 80, 30); + proxyButtonGroup.add(noRadioButton); + proxyButtonGroup.add(yesRadioButton); + proxyIpLabel = new AJLabel("服务器:", labelColor, 25, 70, 100, 30); + proxyIpField = new AJTextField(setting.getProxyIp(), "", 125, 70, 360, 30); + proxyPortLabel = new AJLabel("端口:", labelColor, 25, 110, 100, 30); + proxyPortField = new AJTextField(setting.getProxyPort(), "", 125, 110, 360, 30); + proxyUsernameLabel = new AJLabel("用户名:", labelColor, 25, 150, 100, 30); + proxyUsernameField = new AJTextField(setting.getProxyUsername(), "", 125, 150, 360, 30); + proxyPwdLabel = new AJLabel("密码:", labelColor, 25, 190, 100, 30); + proxyPwdField = new JPasswordField(setting.getProxyPwd()); + proxyPwdField.setBounds(125, 190, 360, 30); + proxyTestBtn = new AJButton("测试", "", "", new OperaBtnMouseListener(mainWindow, MouseAction.CLICK, new IListenerTask() { + public void doWork(Window window, MouseEvent e) { + if(testProxyWindow == null){ + testProxyWindow = new TestProxyWindow(setting); + } + testProxyWindow.setVisible(true); + } + }), 125, 230, 60, 30); + + addComponentsJpanel(proxyPanel, proxyLabel, noRadioButton, yesRadioButton, proxyIpLabel, proxyIpField, proxyPortLabel, proxyPortField, + proxyUsernameLabel, proxyUsernameField, proxyPwdLabel, proxyPwdField, proxyTestBtn); + settingTabPanel.add("基本配置", basicPanel); settingTabPanel.add("脚本配置", scriptPanel); + settingTabPanel.add("代理配置", proxyPanel); + @@ -307,6 +361,23 @@ else if(index == 1){ mainWindow.settingDbTemplate.update(mainWindow.setting);//保存 JOptionPane.showMessageDialog(this_, "保存成功"); } + //代理设置 + else if(index == 2){ + boolean useProxy = settingWindow.yesRadioButton.isSelected() ? true : false; + String proxyIp = settingWindow.proxyIpField.getText(); + String proxyPort = settingWindow.proxyPortField.getText(); + String proxyUsername = settingWindow.proxyUsernameField.getText(); + String proxyPwd = String.valueOf(settingWindow.proxyPwdField.getPassword()); + + setting.setUseProxy(useProxy); + setting.setProxyIp(proxyIp); + setting.setProxyPort(proxyPort); + setting.setProxyUsername(proxyUsername); + setting.setProxyPwd(proxyPwd); + Proxy.init(useProxy, proxyIp, proxyPort, proxyUsername, proxyPwd); + mainWindow.settingDbTemplate.update(mainWindow.setting);//保存 + JOptionPane.showMessageDialog(this_, "保存成功"); + } } }), 32, 200, 60, 30); diff --git a/src/org/arong/egdownloader/ui/window/TestProxyWindow.java b/src/org/arong/egdownloader/ui/window/TestProxyWindow.java new file mode 100644 index 0000000..bcf8f51 --- /dev/null +++ b/src/org/arong/egdownloader/ui/window/TestProxyWindow.java @@ -0,0 +1,112 @@ +package org.arong.egdownloader.ui.window; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Window; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; + +import org.arong.egdownloader.model.Setting; +import org.arong.egdownloader.spider.WebClient; +import org.arong.egdownloader.ui.ComponentUtil; +import org.arong.egdownloader.ui.listener.MouseAction; +import org.arong.egdownloader.ui.listener.OperaBtnMouseListener; +import org.arong.egdownloader.ui.swing.AJButton; +import org.arong.egdownloader.ui.swing.AJLabel; +import org.arong.egdownloader.ui.swing.AJTextArea; +import org.arong.egdownloader.ui.swing.AJTextField; +import org.arong.egdownloader.ui.work.interfaces.IListenerTask; +/** + * 代理测试窗口 + * @author dipoo + * @since 2016-03-23 + */ +public class TestProxyWindow extends JDialog{ + + private static final long serialVersionUID = 1922141062996395003L; + + public TestProxyWindow(final Setting setting){ + this.setTitle("代理测试"); + this.setSize(600, 460); + this.getContentPane().setLayout(null); + this.setResizable(false); + this.setLocationRelativeTo(null); + JLabel urlLabel = new AJLabel("测试地址:", Color.BLUE, 10, 15, 60, 30); + final JTextField urlField = new AJTextField("http://1212.ip138.com/ic.asp", "", 70, 15, 435, 30); + JLabel typeLabel = new AJLabel("测试类型:", Color.BLUE, 10, 55, 60, 30); + ButtonGroup buttonGroup = new ButtonGroup(); + final JRadioButton rb1 = new JRadioButton("内置", true); + rb1.setBounds(125, 55, 100, 30); + final JRadioButton rb2 = new JRadioButton("HttpClient"); + rb2.setBounds(225, 55, 100, 30); + buttonGroup.add(rb1); + buttonGroup.add(rb2); + final JTextArea resultArea = new AJTextArea(); + resultArea.setEditable(false); + resultArea.setAutoscrolls(true); + resultArea.setLineWrap(true); + resultArea.setBorder(null); + resultArea.setFont(new Font("宋体", Font.PLAIN, 12)); + resultArea.setForeground(new Color(63,127,95)); + + JScrollPane consolePane = new JScrollPane(resultArea); + TitledBorder border = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(219,219,219)), "测试结果"); + consolePane.setBounds(10, 100, 568, 310); + consolePane.setAutoscrolls(true); + consolePane.setBorder(border); + + final JButton testBtn = new AJButton("执行测试", "", "", new OperaBtnMouseListener(this, MouseAction.CLICK, new IListenerTask() { + public void doWork(Window window, MouseEvent e) { + String url = urlField.getText(); + if("".equals(url)){ + JOptionPane.showMessageDialog(null, "地址不能为空"); + return; + } + resultArea.setText(""); + String result = null; + try{ + if(rb1.isSelected()){ + result = WebClient.getRequestUseJava(url, "gb2312"); + } + if(rb2.isSelected()){ + result = WebClient.postRequest(url, "gb2312"); + } + resultArea.setText(result); + }catch(Exception e1){ + resultArea.setText(e1.getMessage()); + } + } + }), 515, 15, 60, 30); + + + ComponentUtil.addComponents(getContentPane(), urlLabel, urlField, testBtn, typeLabel, rb1, rb2, consolePane); + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + //关闭后显示主界面 + TestProxyWindow w = (TestProxyWindow)e.getSource(); + w.dispose(); + } + //窗体由激活状态变成非激活状态 + public void windowDeactivated(WindowEvent e) { + //关闭后显示主界面 + TestProxyWindow w = (TestProxyWindow)e.getSource(); + w.dispose(); + } + }); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setVisible(true); + } +} diff --git a/src/org/arong/egdownloader/ui/work/DownloadWorker.java b/src/org/arong/egdownloader/ui/work/DownloadWorker.java index 7464da8..745b91d 100644 --- a/src/org/arong/egdownloader/ui/work/DownloadWorker.java +++ b/src/org/arong/egdownloader/ui/work/DownloadWorker.java @@ -78,8 +78,15 @@ protected Void doInBackground() throws Exception { }else{ is = WebClient.getStreamUseJava(pic.getRealUrl()); } + if(this.isCancelled())//是否暂停 return null; + if(is == null){ + pic.setRealUrl(null); + Tracker.println(task.getName() + ":" + pic.getName() + ":图片流无效"); + exceptionNum ++; + continue; + } int size = is.available(); if(size < 1000){ pic.setRealUrl(null); @@ -155,7 +162,8 @@ protected Void doInBackground() throws Exception { return null; }catch (Exception e){ //碰到异常 - Tracker.println(task.getName() + ":" + pic.getName() + e.getMessage()); + e.printStackTrace(); + Tracker.println(task.getName() + ":" + pic.getName() + e.getLocalizedMessage()); //继续下一个 continue; } diff --git a/src/org/arong/util/CodeUtil.java b/src/org/arong/util/CodeUtil.java new file mode 100644 index 0000000..975faf0 --- /dev/null +++ b/src/org/arong/util/CodeUtil.java @@ -0,0 +1,129 @@ +package org.arong.util; + +import java.security.MessageDigest; +import java.util.Random; + +public class CodeUtil { + // 定义分隔符常量 + public static final String DIVIDE_CHAR = "%"; + private static final int DIS1 = 18500; + private static final int DIS2 = -222; + private static final int RANDOM_NUM = 12345; + + /** + * 返回中文(所有字符)字符串的unicode码 + * + * @param s + * @return + */ + public static String myEncode(String s) { + String str = null; + // 如果待转化的字符串不为空 + if (s != null && s.trim().length() > 0) { + // 创建字符串缓冲区 + StringBuffer sb = new StringBuffer(); + // 将待转化的字符串转成字符数组 + // 创建一个随机数对象 + Random random = new Random(); + int start = random.nextInt(RANDOM_NUM); + int end = random.nextInt(RANDOM_NUM); + sb.append(start + DIVIDE_CHAR); + char[] chars = s.toCharArray(); + // 遍历此字符数组 + for (int i = 0; i < chars.length; i++) { + char ch = chars[i]; + sb.append((int) ch + DIS1 + i + DIS2 + start - end + + DIVIDE_CHAR); + } + sb.append(end); + // 转化为字符串 + str = sb.toString(); + } + return str; + } + + /** + * 解码 + * + * @param codeStr + * @return + */ + public static String myDecode(String codeStr) { + String str = null; + // 待反编码的字符串不为空 + if (codeStr != null && codeStr.trim().length() > 0) { + // 将字符串以逗号分隔成字符串数组 + String[] codes = codeStr.split("" + DIVIDE_CHAR + ""); + int start = Integer.parseInt(codes[0]); + int end = Integer.parseInt(codes[codes.length - 1]); + // 建立字符串缓冲区 + StringBuffer sb = new StringBuffer(); + // 定义一个初始ASCII码变量 + int code = 0; + // 遍历字符串数组 + for (int i = 1; i < codes.length - 1; i++) { + try { + code = Integer.parseInt(codes[i]) - DIS1 - i + 1 - DIS2 + - start + end; + } catch (NumberFormatException e) { + e.printStackTrace(); + throw new RuntimeException("这个字符串不符合规格,请传入形如:“1" + + DIVIDE_CHAR + "2" + DIVIDE_CHAR + "3" + + DIVIDE_CHAR + "4”之类的字符串"); + } + sb.append((char) code); + } + str = sb.toString(); + } + return str; + } + + /** + * MD5加密相关 + */ + private static String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "A", "B", "C", "D", "E", "F" }; + + private static String byteArrayToHexString(byte[] byteArray) { + StringBuffer sb = new StringBuffer(); + for (byte b : byteArray) { + // 将每一个byte转换十六进制数 + sb.append(byteToHexChar(b)); + } + return sb.toString(); + } + + // 核心 + private static Object byteToHexChar(byte b) {// -128到+127之间 + int n = b;// n=110 + // 如果n为负数 + if (n < 0) { + // 转正 + n = 256 + n; + } + // 第一位是商 + int d1 = n / 16;// d1 = 6 + // 第二位是余数 + int d2 = n % 16;// d2 = 14 + // 拼接字符串 + return hex[d1] + hex[d2]; + } + /** + * MD5加密 + * @param password + * @return + * @throws Exception + */ + public static String md5Encode(String password) throws Exception { + if (password == null) { + throw new Exception(); + } + // 创建密码生成器(MD5或SHA) + MessageDigest md5 = MessageDigest.getInstance("MD5"); + // 将明文转成byte[] + byte[] byteArray = md5.digest(password.getBytes()); + // 将byte[]转成十六进制的字符串 + String passwordMD5 = byteArrayToHexString(byteArray); + return passwordMD5; + } +}