總結下前些時候的那個項目(Java+vb.net) – JAVA編程語言程序開發技術文章

去年的時候 從剛到南京就開始做這個對賬項目:
 業務過程不方便說瞭,牽扯到的技術問題有以下幾個:
 1、java的socket傳輸
 2、java的ftp主動方式傳輸
 3、第三方提供的一個dll 做CA簽名用的
 4、java操作文件
 5、java解析xml字符串
 5、java更新數據庫
 =================================
 主要就是以上的幾個問題,因為剛參加工作不久,所以在經驗上比較匱乏,走瞭不少的彎路,現在想想,很多簡單的問題,
 當時怎麼就想的那麼復雜呢!!!
 反思反思!!!
 =================================
 首先,socket傳輸,這部分比較簡單,隻不過服務器端不是我寫的,而且在socket的發送和接收的時候都需要進行一個簡單的壓縮加密、解密。所以,在傳輸的時候用簡單的Buffer就不行瞭。
 這一部分可以參見:
 /kf/201203/121864.html
 /kf/201203/121865.html
 這兩篇文章 。。。
 =================================
 接下來說ftp傳輸,本來在最開始的時候 使用的一直以來一個比較成熟的FTP傳輸工具,但是在實際使用的時候發現這個工具不可以使用。後來才瞭解到ftp服務器的訪問方式是主動方式。
 後來使用瞭一個開源庫:edtftpj
 使用這個就比較方便瞭,比我自己寫的好用太多瞭。
 下面是FTP部分的代碼:
   1 /*
   2  * To change this template, choose Tools | Templates
   3  * and open the template in the editor.
   4  */
   5 package test;
   6
   7 import com.enterprisedt.net.ftp.FTPClient;
   8 import com.enterprisedt.net.ftp.FTPConnectMode;
   9 import com.enterprisedt.net.ftp.FTPMessageCollector;
  10 import com.enterprisedt.net.ftp.FTPTransferType;
  11 import com.enterprisedt.util.debug.Logger;
  12 import java.io.File;
  13 import java.io.FileInputStream;
  14 import java.io.FileOutputStream;
  15 import java.net.URL;
  16
  17 /**
  18  *
  19  * @author Icer
  20  */
  21 public class FtpClient {
  22
  23     private FTPClient ftp = null;
  24
  25     public FTPClient connFtpServer(String host, int port, String username, String password) {
  26             ftp = new FTPClient();
  27         try {
  28           
  29             ftp.setRemoteHost(host);
  30             ftp.setRemotePort(port);
  31             FTPMessageCollector listener = new FTPMessageCollector();
  32             ftp.setMessageListener(listener);
  33           
  34             System.out.println("Connecting");
  35             ftp.connect();
  36
  37             System.out.println("Logging in");
  38             ftp.login(username, password);
  39           
  40             System.out.println("Setting up passive,ASCII transfers");
  41             ftp.setConnectMode(FTPConnectMode.PASV);
  42             ftp.setType(FTPTransferType.ASCII);
  43           
  44         } catch (Exception e) {
  45             e.printStackTrace();
  46         }
  47         return ftp;
  48     }
  49
  50     public void upload(String localfile, URL url) {
  51         String host = url.getHost();
  52         int port = url.getPort();
  53         File filePath = new File(url.getPath());
  54         String directory = filePath.getParent().substring(1);
  55         String filename = filePath.getName();
  56         try {
  57             ftp.chdir(directory);
  58             ftp.put(new FileInputStream(localfile), filename);
  59         } catch (Exception e) {
  60             e.printStackTrace();
  61             System.out.println("upload failed");
  62         }
  63     }
  64   
  65   
  66     public void upload(String localpath, String filename) {
  67         try {
  68             if(ftp.connected()){
  69          
  70                ftp.put(localpath, filename);
  71                ftp.dir();
  72              
  73                 System.out.println("hello");
  74             } else {
  75                 System.out.println("wrong");
  76             }
  77           
  78         } catch (Exception e) {
  79             System.out.println("upload failed");
  80             e.printStackTrace();
  81         }
  82     }
  83
  84     public void DownloadFile(String localpath,String filename) {
  85         try {
  86             ftp.chdir("");
  87             String[] files = ftp.dir("", true);
  88           
  89             for (int i = 0; i < files.length; i++) {
  90              
  91                 System.out.println(files[i]);
  92               
  93                 ftp.get(new FileOutputStream(localpath + filename), filename);
  94               
  95             }
  96         } catch (Exception e) {
  97             e.printStackTrace();
  98             System.out.println("upload failed");
  99         }
 100     }
 101
 102     public void disConn() {
 103         try {
 104             ftp.quit();
 105         } catch (Exception e) {
 106             System.out.println("disconnection failed");
 107             e.printStackTrace();
 108         }
 109     }
 110  
 111    
 112     public static void main(String[] args) throws Exception{
 113      
 114     }
 115 }
 
 =======================
 再說CA簽名的部分,因為這塊第三方提供的DLL,用Java調用要用JNI重寫DLL ,對VC那塊不熟的我,就用.NET做瞭個守護程序,負責對兩個文件夾裡面的文件分別進行簽名和簽名認證,並將其結果分別寫到一個文件中,供Java程序讀取調用。
 PS:在這個過程中,遇到瞭一個問題,會出現java程序和.NET這邊的程序同時訪問同一個文件的情況,就是那個簽名結果文件。後來的時候,我將這個文件復制瞭一份,讓java查找復制後的文件,如果找到,再回去找到源文件,這樣就沒有同時訪問的問題瞭。
 這部分,其實就是調用一下人傢的函數,沒啥技術含量,唯一一個就是用瞭下多線程來控制簽名和認證的兩個函數的運行。
 =======================
 Java操作文件:
 這部分也不是什麼大問題,主要就是文件的編碼問題:在eclipse下好好的程序 放在netbeans下用的時候就出現瞭亂碼,文件裡的中文讀出來亂碼,所以文件頭的包長也就計算不正確瞭。
 後來,使用瞭這樣的代碼:
  1 /**
  2      * @parameter fileName 要讀取的文件名
  3      * @return 文件內容
  4 */
  5     public static String readFile(String fileName) {
  6         String context = "";
  7         File f = new File(fileName);
  8         BufferedReader bufReader = null;
  9         try {
 10             InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "GBK");
 11             bufReader = new BufferedReader(isr);
 12             context = bufReader.readLine();
 13
 14         } catch (IOException ie) {
 15             ie.printStackTrace();
 16         } finally {
 17             try {
 18                 bufReader.close();
 19             } catch (Exception e) {
 20                 e.printStackTrace();
 21             }
 22         }
 23
 24         return context;
 25     }
 
 
原來是直接用Reader去讀的,比較悲慘。。。以後引以為戒,能自己設定編碼的情況 一定自己hold住。。。
 ========================
 關於Java解析xml的這部分,很大眾的,用dom4j.
   1 import java.io.File;
   2 import java.io.FileWriter;
   3 import java.io.IOException;
   4 import java.io.Writer;
   5 import java.util.Iterator;
   6
   7 import org.dom4j.Document;
   8 import org.dom4j.DocumentException;
   9 import org.dom4j.DocumentHelper;
  10 import org.dom4j.Element;
  11 import org.dom4j.io.OutputFormat;
  12 import org.dom4j.io.SAXReader;
  13 import org.dom4j.io.XMLWriter;
  14
  15 /**
  16  * @author Icer
  17  */
  18
  19 public class Dom4jDemo {
  20
  21     /**
  22      * 解析xml格式字符串
  23      * @return 對賬文件名
  24 */
  25     public String parseXmlName(String xml){
  26         System.out.println("接收到的字符串為:" + xml);
  27         String findFileName = "";
  28         try {
  29             Document document = DocumentHelper.parseText(xml);
  30             Element root = document.getRootElement();
  31             for (Iterator i = root.elementIterator(); i.hasNext();) {
  32                 Element head = (Element) i.next();
  33                 for (Iterator j = head.elementIterator(); j.hasNext();) {
  34                     Element elem = (Element) j.next();
  35                     for(Iterator k = elem.elementIterator();k.hasNext();){
  36                         Element data = (Element) k.next();
  37                         System.out.println(">>>"+data.getName() + ":" + data.getText());
  38                         if("DZJGWJM".equals(data.getName())){
  39                             findFileName = data.getText();
  40                         }
  41                     }
  42                 }
  43             }
  44         } catch (DocumentException e) {
  45             System.out.println(e.getMessage() + "hello");
  46         }
  47         System.out.println("dom4j parserXml");
  48         return findFileName;
  49     }
  50   
  51     /**
  52      *  解析接收到的xml字符串
  53      * @param xml
  54      * @return 獲得ca簽名後的字符串
  55 */
  56     public  String parseXmlCa(String xml){
  57         System.out.println("接收到的字符串為:" + xml);
  58         String ca = "";
  59         try {
  60             Document document = DocumentHelper.parseText(xml);
  61             Element root = document.getRootElement();
  62             for (Iterator i = root.elementIterator(); i.hasNext();) {
  63                 Element head = (Element) i.next();
  64                 for (Iterator j = head.elementIterator(); j.hasNext();) {
  65                     Element elem = (Element) j.next();
  66                     System.out.println(">>>"+elem.getName() + ":" + elem.getText());
  67                     for(Iterator k = elem.elementIterator();k.hasNext();){
  68                         Element data = (Element) k.next();
  69                         System.out.println(">>>"+data.getName() + ":" + data.getText());
  70                         if("CA".equals(data.getName())){
  71                             ca = data.getText();
  72                         }
  73                     }
  74                 }
  75             }
  76         } catch (DocumentException e) {
  77             System.out.println(e.getMessage() + "hello");
  78         }
  79         return ca;
  80     }
  81       
  82         public int parseXmlStatus(String xml){
  83         int status = 0;
  84         try {
  85             Document document = DocumentHelper.parseText(xml);
  86             Element root = document.getRootElement();
  87             for (Iterator i = root.elementIterator(); i.hasNext();) {
  88                 Element head = (Element) i.next();
  89                 for (Iterator j = head.elementIterator(); j.hasNext();) {
  90                     Element elem = (Element) j.next();
  91                     System.out.println(">>>"+elem.getName() + ":" + elem.getText());
  92                                         if("STATUS".equals(elem.getName())){
  93                                             status = Integer.parseInt(elem.getTextTrim());
  94                                         }
  95                 }
  96             }
  97         } catch (DocumentException e) {
  98             System.out.println(e.getMessage() + "hello");
  99         }
 100         return status;
 101         }
 
 
更新數據庫這部分就更沒什麼技術價值瞭。事務更新。地球人都懂,就不獻醜瞭。。。
 
 =====================
 上面的代碼均為測試代碼,註釋什麼的都不全,湊合著看瞭。。。
 從來沒有什麼能夠阻擋我前進的步伐,今天沒有,明天也不會有。

 

發佈留言