`

基于JavaEye-API实现的Gerry-聊天QQ版v1.0 (全)

阅读更多

目录结构如下:

--bean
----------MessageBean.java
----------ReceiveBean.java
----------SenderBean.java

---gerry
----------ClientViewMain.java
----------IconThread.java

----------ShowThread.java

---images

----------pmt.gif

----------pmtwhite.gif

---lib
----------commons-beanutils-1.8.0.jar
----------commons-codec-1.3.jar
----------commons-collections-3.2.1.jar
----------commons-lang-2.4.jar
----------commons-logging-1.1.1.jar
----------ezmorph-1.0.6.jar

----------httpclient-4.0-beta2.jar

----------httpcore-4.0-beta3.jar
----------json-lib-2.3-jdk15.jar

---tools
----------ClientUtils.java
----------Native2AsciiUtils.java
----------TimeUtil.java

 

1.
json-lib-2.3-jdk15.jar
http://sourceforge.net/projects/json-lib/files

2.
http-client , http-core
http://hc.apache.org/

3.ezmorph-1.0.3.jar,commons-lang.jar,commons-logging.jar,commons-beanutils.jar,commons-collections-3.2.jar
可以下载jar包的网站http://www.docjar.com/

 

 

 

 

MessageBean.java


package bean;   
  
public class MessageBean {   
  
        private String system_notice ;   
        private String created_at ;   
        private String plain_body ;   
        private String title ;   
        private String id ;   
        private String has_read ;   
        private String attach ;   
        private SenderBean sender ;   
        private ReceiveBean receiver ;   
           
           
        public String getAttach() {   
            return attach;   
        }   
        public void setAttach(String attach) {   
            this.attach = attach;   
        }   
        public String getCreated_at() {   
            return created_at;   
        }   
        public void setCreated_at(String created_at) {   
            this.created_at = created_at;   
        }   
        public String getHas_read() {   
            return has_read;   
        }   
        public void setHas_read(String has_read) {   
            this.has_read = has_read;   
        }   
        public String getId() {   
            return id;   
        }   
        public void setId(String id) {   
            this.id = id;   
        }   
        public String getPlain_body() {   
            return plain_body;   
        }   
        public void setPlain_body(String plain_body) {   
            this.plain_body = plain_body;   
        }   
        public ReceiveBean getReceiver() {   
            return receiver;   
        }   
        public void setReceiver(ReceiveBean receiver) {   
            this.receiver = receiver;   
        }   
        public SenderBean getSender() {   
            return sender;   
        }   
        public void setSender(SenderBean sender) {   
            this.sender = sender;   
        }   
        public String getSystem_notice() {   
            return system_notice;   
        }   
        public void setSystem_notice(String system_notice) {   
            this.system_notice = system_notice;   
        }   
        public String getTitle() {   
            return title;   
        }   
        public void setTitle(String title) {   
            this.title = title;   
        }   
           
     
}  

 

   

ReceiveBean.java


package bean;   
  
public class ReceiveBean {   
  
        private String name ;   
        private String logo ;   
        private String domain ;   
         
         
        public String getDomain() {   
            return domain;   
        }   
        public void setDomain(String domain) {   
            this.domain = domain;   
        }   
        public String getLogo() {   
            return logo;   
        }   
        public void setLogo(String logo) {   
            this.logo = logo;   
        }   
        public String getName() {   
            return name;   
        }   
        public void setName(String name) {   
            this.name = name;   
        }   
         
         
         
}   

 

SenderBean.java

package bean;   
  
public class SenderBean {   
  
        private String name ;   
        private String logo ;   
        private String domain ;   
         
         
        public String getDomain() {   
            return domain;   
        }   
        public void setDomain(String domain) {   
            this.domain = domain;   
        }   
        public String getLogo() {   
            return logo;   
        }   
        public void setLogo(String logo) {   
            this.logo = logo;   
        }   
        public String getName() {   
            return name;   
        }   
        public void setName(String name) {   
            this.name = name;   
        }   
         
         
         
}   

 

ClientViewMain.java

package gerry;   
  
import java.awt.Container;   
import java.awt.GridLayout;   
import java.awt.Image;     
import java.awt.Label;   
import java.awt.MenuItem;   
import java.awt.PopupMenu;   
import java.awt.SystemTray;   
import java.awt.TextArea;
import java.awt.TextField;   
import java.awt.Toolkit;     
import java.awt.event.ActionEvent;   
import java.awt.event.ActionListener;   
import java.io.IOException;   
import java.net.URL;
import java.sql.Timestamp;   
import java.util.ArrayList;   
import java.util.List;   
import javax.swing.BoxLayout;   
import javax.swing.JButton;   
import javax.swing.JFrame;   
import javax.swing.JOptionPane;
import net.sf.json.JSONArray;   
import org.apache.http.client.ClientProtocolException;   
import tools.ClientUtils;   
import tools.Native2AsciiUtils;   
import tools.TimeUtil;   
import bean.MessageBean;   
    
  
/**  
 * @author   Gerry Cheung(V1.0)  
 * @version  2010-09-03  (恋爱三个月纪念版) 
 */   
 public class ClientViewMain {     
        
     /*User param setting*/        
     private static String  user_name = "111" ;        
     private static String  user_pass = "111" ;        
     private static String  receive_name = "111" ;        
     private static boolean isproxy = false ;        
        
     /*System param*/        
     //The JE only can show fifteen rows by api         
     public  static List<MessageBean> listBean = new ArrayList<MessageBean>();        
     public  static String last_update_time = "2000/01/01 00:00:00.00" ;        
     private static URL pmt_url = ClientViewMain.class.getClass().getResource("/images/pmt.gif"); 
     private static URL pmt_urlwhite = ClientViewMain.class.getClass().getResource("/images/pmtwhite.gif");
     private static Image image = Toolkit.getDefaultToolkit().getImage(pmt_url);    
     private static java.awt.TrayIcon ti = new java.awt.TrayIcon(image);     
     private static int count  = 0 ;   
     private static ShowThread showThread = new ShowThread();   
     private static IconThread iconThread = new IconThread();   
     private static int screenWidth =Toolkit.getDefaultToolkit().getScreenSize().width;
     private static int screenHeight=Toolkit.getDefaultToolkit().getScreenSize().height;
     
     //Login Frame   
     private static JFrame f1 = new JFrame("Login");   
     private static TextField  tName = new TextField();   
     private static TextField  tPass = new TextField();   
     private static TextField  tReceive = new TextField(); 
     private static JButton b_login = new JButton("Login");  
     //Send Frame
     private static JFrame f2 = new JFrame("Send");
     private static TextArea sContent = new TextArea("",10,10,TextArea.SCROLLBARS_VERTICAL_ONLY);
     private static JButton s_send = new JButton("Send"); 
     
     //Show Last Message
     private static JFrame f3 = new JFrame("Show");
     private static TextArea textareashow = new TextArea("",10,10,TextArea.SCROLLBARS_VERTICAL_ONLY);
     
     //Show History 
     private static JFrame f4 = new JFrame("History");
     private static TextArea textareahistory = new TextArea("",10,10,TextArea.SCROLLBARS_VERTICAL_ONLY);
     
     
     public static void systemTray(){     
    	 
         try{     
             if (SystemTray.isSupported()){    
                    SystemTray  st = SystemTray.getSystemTray();     
                    PopupMenu menu = new PopupMenu();   
                       
                    menu.add("O(∩_∩)O From:2010-06-03 To forever...  O(∩_∩)O");   
                    menu.add("O(∩_∩)O Ling:Gerry in your heart !            O(∩_∩)O");   
                    menu.add("O(∩_∩)O GerryLing  [恋爱三个月纪念版]  O(∩_∩)O");
                    
                    MenuItem item0 = new MenuItem();   
                    item0.setLabel("Send");   
                    item0.addActionListener( new ActionListener(){   
                        public void actionPerformed( ActionEvent ae ){   
                        	  sendMessage();
                        }   
                    });   
                    menu.add(item0);   
                       
                    MenuItem item1 = new MenuItem();   
                    item1.setLabel("Refresh");   
                    item1.addActionListener( new ActionListener(){   
                        public void actionPerformed( ActionEvent ae ){   
                              receiveNewMessage();   
                        }   
                    });   
                    menu.add(item1);   
                       
                    MenuItem item3 = new MenuItem();   
                    item3.setLabel("History");   
                    item3.addActionListener( new ActionListener(){   
                        public void actionPerformed( ActionEvent ae ){   
                        	receiveMessage();
                        }   
                    });   
                    menu.add(item3);   
                       
                    menu.add("About   Version1.0  2010-09-03");   
                       
                    MenuItem item2 = new MenuItem();   
                    item2.setLabel("Quit");   
                    item2.addActionListener( new ActionListener(){   
                        public void actionPerformed(ActionEvent ae){   
                              showThread.stop();   
                              iconThread.stop();   
                              System.exit(0);   
                        }   
                    });   
                    menu.add(item2);   
                    //show last message   
                    ti.addActionListener( new ActionListener(){   
                        public void actionPerformed(ActionEvent ae){   
                               showLastListMsg();   
                        }   
                    });   
                    ti.setToolTip ("["+user_name+"]"+"You have 0 message to Read !");     
                    ti.setPopupMenu (menu);       
                    st.add(ti);        
                }     
          }catch (Exception e){   
                   System.exit(0);   
          }            
                 
  }     
     
     
  public static String receiveMessage(){        
         
      String strResult = null;        
      try {        
          strResult = ClientUtils.getJsonContent("api.iteye.com","api/messages/inbox", user_name,user_pass,isproxy);        
      } catch (ClientProtocolException e) {        
          e.printStackTrace();        
      } catch (IOException e) {        
          e.printStackTrace();        
      }        
      //Use JSON-LIB parse data         
      JSONArray jsonArray = JSONArray.fromObject(Native2AsciiUtils.ascii2Native(strResult));        
      MessageBean[] beans = (MessageBean[])JSONArray.toArray(jsonArray, MessageBean.class); 
      String strMsg = "" ;
      for(int i=0;i<beans.length;i++){        
    	  strMsg = strMsg + "No."+(i+1)+": ["+beans[i].getCreated_at()+"] "+beans[i].getSender().getName()+" :"+beans[i].getPlain_body()+"\n";        
      }
      if(null!=strMsg && !"".equals(strMsg)){
    	  textareahistory.setText(strMsg);
          f4.setSize(550, 200);
          f4.setLocation((screenWidth-f4.getWidth())/2, (screenHeight-f4.getHeight())/2);
          f4.setResizable(true);
          Container contentPane = f4.getContentPane();   
          contentPane.setLayout(new BoxLayout(contentPane,2)); 
          contentPane.add(textareahistory);
          f4.show();
      }
      return Native2AsciiUtils.ascii2Native(strResult);        
  }        
	  /**  
	   * Get the new msg  
	   * @return  
	   */   
	  public static List<MessageBean> showLastListMsg(){        
         
		  String strMsg = "" ;
          for(int i=0;i<listBean.size();i++){        
              MessageBean bean = listBean.get(i);        
              Timestamp stamp1 = TimeUtil.getTimeFromString(bean.getCreated_at());        
              Timestamp stamp2 = TimeUtil.getTimeFromString(last_update_time);        
              long diff = TimeUtil.timeDiff2Timestamp(stamp1, stamp2);        
              if(diff>0){        
                  last_update_time = bean.getCreated_at();//取最后一条记录的时间        
              }        
              strMsg = strMsg + "No."+(i+1)+": ["+bean.getCreated_at()+"] "+bean.getSender().getName()+" :"+bean.getPlain_body()+"\n";        
          }   
          //Show List on the Window
          if(null!=strMsg && !"".equals(strMsg)){
	          textareashow.setText(strMsg);
	          f3.setSize(550, 200);
	          f3.setLocation((screenWidth-f3.getWidth())/2, (screenHeight-f3.getHeight())/2);
	          f3.setResizable(true);
	          Container contentPane = f3.getContentPane();   
	          contentPane.setLayout(new BoxLayout(contentPane,2)); 
	          contentPane.add(textareashow);
	          f3.show();
          }
          for(int i=0;i<listBean.size();i++){        
              listBean.remove(i);        
              i--;        
          }   
          ti.setToolTip ("["+user_name+"]"+"You have "+listBean.size()+" message to Read !");     
          return listBean ;        
      }   
     
     
       public static int receiveNewMessage(){   
              
              String strResult = null;        
              try {        
                      strResult = ClientUtils.getJsonContent("api.iteye.com","api/messages/inbox", user_name,user_pass,isproxy);        
                      strResult = Native2AsciiUtils.ascii2Native(strResult);        
                      JSONArray jsonArray = JSONArray.fromObject(Native2AsciiUtils.ascii2Native(strResult));        
                      MessageBean[] beans = (MessageBean[])JSONArray.toArray(jsonArray, MessageBean.class);        
                              
                      for(int i=0;i<listBean.size();i++){        
                          listBean.remove(i);        
                          i--;        
                      }        
                      for(int i=0;i<beans.length;i++){        
                          Timestamp stamp1 = TimeUtil.getTimeFromString(beans[i].getCreated_at());        
                          Timestamp stamp2 = TimeUtil.getTimeFromString(last_update_time);        
                          long diff = TimeUtil.timeDiff2Timestamp(stamp1, stamp2);        
                          if(diff > 0){        
                             listBean.add(beans[i]);        
                          }        
                      }        
              } catch (Exception e) {        
                   Label label1 = null;   
                   JFrame f = new JFrame("Error");   
                   f.setLocation((screenWidth-250)/2, (screenHeight-80)/2);
                   f.setSize(250, 80);
                   f.setResizable(true);
                   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                   label1 = new Label("username/password is incorrect!"+"or Error:"+e.getMessage());   
                   Container contentPane = f.getContentPane();   
                   contentPane.setLayout(new GridLayout(1,1));   
                   contentPane.add(label1);   
                   //f.pack();   
                   f.show();   
            }   
              return 1 ;   
       }   
       
      public static int receiveNewMessageIcon(){   
      
	      // If have new msg ,there must to change the status of the program!   
	      if(listBean.size()>0){        
	            ti.setToolTip ("["+user_name+"]"+"You have "+listBean.size()+" message to Read !");     
	            if(count%2==0){   
	                ti.setImage(Toolkit.getDefaultToolkit().getImage(pmt_urlwhite));     
	            }else{   
	                ti.setImage(Toolkit.getDefaultToolkit().getImage(pmt_url));     
	            }   
	      }else{   
	          count = 0 ;   
	          ti.setImage(Toolkit.getDefaultToolkit().getImage(pmt_url));   
	      }        
	         
	      if(count==1000000000){count=0;}                 
	      count++ ;   
	      return 1 ;     
     }   
 
  
     public static String sendMessage(){   

    	 f2.setSize(500, 180);
         f2.setLocation((screenWidth-f2.getWidth())/2, (screenHeight-f2.getHeight())/2);
         f2.setResizable(true);
         Container contentPane = f2.getContentPane();   
         contentPane.setLayout(new BoxLayout(contentPane,2)); 
         s_send.addActionListener( new ActionListener(){   
             public void actionPerformed(ActionEvent ae){   
            	 String str=null;   
                 String strResult = null;   
                 str = sContent.getText();    
                 try {   
                     //The third param is true for proxy,false for no proxy .   
                	 f2.hide();
                	 str = str.replaceAll("\r", "[Line]");
                	 str = str.replaceAll("\n", "");
                	 //str = str.replaceAll(" ", "");
                	 str = str.replaceAll("\"", "“");
                     strResult = ClientUtils.getJsonContent("api.iteye.com","api/messages/create?title=Message:&receiver_name="+receive_name+"&body="+str, user_name,user_pass,isproxy);
                     JOptionPane pane = new JOptionPane();
            	     pane.showMessageDialog(null, "Message sent successfully!");
                 } catch (Exception e) {   
                	 f2.hide();
                	 JOptionPane pane = new JOptionPane();
            	     pane.showMessageDialog(null, "Message failed,Please try again!");
                 }
                 
             }   
         }); 
         contentPane.add(sContent);
         contentPane.add(s_send);
         f2.show();
         
         return "" ;
         
     }   
     
     
    public static void main(String[] args){     
         
       Container contentPane = f1.getContentPane();   
       contentPane.setLayout(new BoxLayout(contentPane,3));   
       Label label1 = new Label("please input the username,userpass,receivename by order !");   
       tPass.setEchoChar('*');
       b_login.addActionListener( new ActionListener(){   
           public void actionPerformed(ActionEvent ae){   
                 user_name = tName.getText();   
                 user_pass  = tPass.getText();   
                 receive_name = tReceive.getText();   
                 showThread.start();   
                 iconThread.start();   
                 f1.hide();
                 systemTray();
           }   
       });   
         
       f1.setSize(350, 150);
       f1.setLocation((screenWidth-f1.getWidth())/2, (screenHeight-f1.getHeight())/2);
       f1.setResizable(false);
       f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       contentPane.add(label1);   
       contentPane.add(tName);   
       contentPane.add(tPass);   
       contentPane.add(tReceive);   
       contentPane.add(b_login); 
       //f1.pack();   
       f1.show();   
          
    }    
 
  }   

 

 

 

   

IconThread.java

package gerry;   
  
public class IconThread extends Thread{        
       
    public long times = 500L ; //500ms        
            
    public IconThread(){}        
            
    @SuppressWarnings("static-access")        
    public void run()  {        
        while(true){        
            ClientViewMain.receiveNewMessageIcon();//图标闪动      
            try {        
                this.sleep(times);        
            } catch (InterruptedException e) {        
                e.printStackTrace();        
            }        
        }        
    }        
            
            
}        

 

 

 

ShowThread.java

package gerry;   
  
public class ShowThread extends Thread{        
       
    public long times = 30000L ; //30000ms        
            
    public ShowThread(){}        
            
    @SuppressWarnings("static-access")        
    public void run()  {        
        while(true){        
            ClientViewMain.receiveNewMessage();//程序后台接收数据        
            try {        
                this.sleep(times);        
            } catch (InterruptedException e) {        
                e.printStackTrace();        
            }        
        }        
    }        
            
}      

 

 

  

images 文件夹

两个图片文件:pmt.gif 托盘图标
pmtwhite.gif  16X16透明图片

 

 

  

ClientUtils.java

package tools;   
  
import java.io.IOException;   
import org.apache.http.HttpEntity;   
import org.apache.http.HttpException;   
import org.apache.http.HttpHost;   
import org.apache.http.HttpRequest;   
import org.apache.http.HttpRequestInterceptor;   
import org.apache.http.HttpResponse;   
import org.apache.http.auth.AuthScheme;   
import org.apache.http.auth.AuthScope;   
import org.apache.http.auth.AuthState;   
import org.apache.http.auth.Credentials;   
import org.apache.http.auth.UsernamePasswordCredentials;   
import org.apache.http.client.ClientProtocolException;   
import org.apache.http.client.CredentialsProvider;   
import org.apache.http.client.methods.HttpGet;   
import org.apache.http.client.protocol.ClientContext;   
import org.apache.http.conn.params.ConnRoutePNames;   
import org.apache.http.impl.auth.BasicScheme;   
import org.apache.http.impl.client.DefaultHttpClient;   
import org.apache.http.protocol.BasicHttpContext;   
import org.apache.http.protocol.ExecutionContext;   
import org.apache.http.protocol.HttpContext;   
import org.apache.http.util.EntityUtils;   
  
public class ClientUtils {   
    /**  
     * 基于Basic认证的httpclient 连接  
     * @param hostUrl 要请求的host name    如:http://api.iteye.com/api/twitters/list -> api.iteye.com  
     * @param getUrl  要请求的get url     如:http://api.iteye.com/api/twitters/list -> api/twitters/list  
     * @param userName  username  
     * @param password  password  
     * @param isProxy   isProxy  
     * @return javaeye api 返回的json字符串  
     * @throws IOException   
     * @throws ClientProtocolException   
     */   
    public static String getJsonContent(String hostUrl,String getUrl,String userName,String password,boolean isProxy) throws ClientProtocolException, IOException{   
        String jsonStr="";   
        getUrl = getUrl.replaceAll(" ", ",");   
           
        DefaultHttpClient httpclient = new DefaultHttpClient();   
           
        httpclient.getCredentialsProvider().setCredentials(new AuthScope(hostUrl, 80), new UsernamePasswordCredentials(userName, password));   
        BasicHttpContext localcontext = new BasicHttpContext();   
  
        BasicScheme basicAuth = new BasicScheme();   
        localcontext.setAttribute("preemptive-auth", basicAuth);   
        httpclient.addRequestInterceptor((HttpRequestInterceptor) new PreemptiveAuth(), 0);   
           
        HttpHost targetHost = new HttpHost(hostUrl);   
        //Set proxy    
        if(isProxy){   
          HttpHost proxy = new HttpHost("openproxy.xxx.com",8080);   
          httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);   
        }   
        HttpGet httpget = new HttpGet("/" + getUrl);   
           
        HttpResponse response = httpclient.execute(targetHost, httpget, localcontext);   
        HttpEntity entity = response.getEntity();   
  
        if (entity != null) {               
            jsonStr = EntityUtils.toString(entity);   
            //System.out.println(jsonStr);               
            entity.consumeContent();   
        }   
        httpclient.getConnectionManager().shutdown();    
        return jsonStr;   
    }   
       
    static class PreemptiveAuth implements HttpRequestInterceptor {   
  
        public void process(final HttpRequest request,final HttpContext context) throws HttpException, IOException {   
               
            AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);   
            // If no auth scheme avaialble yet, try to initialize it preemptively   
            if (authState.getAuthScheme() == null) {   
                AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth");   
                CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER);   
                HttpHost targetHost = (HttpHost) context.getAttribute(   
                        ExecutionContext.HTTP_TARGET_HOST);   
                if (authScheme != null) {   
                    Credentials creds = credsProvider.getCredentials(   
                            new AuthScope(   
                                    targetHost.getHostName(),    
                                    targetHost.getPort()));   
                    if (creds == null) {   
                        throw new HttpException("No credentials for preemptive authentication");   
                    }   
                    authState.setAuthScheme(authScheme);   
                    authState.setCredentials(creds);   
                }   
            }   
               
        }   
    }   
       
}   

 

 

  

Native2AsciiUtils.java

package tools;   
  
/**    
 * 仿照JDK-native2ascii.exe功能实现的(Java源代码)  
 * Unicode编码转码  
 * 2010-08-06  
 * @author  Gerry   
 * @version 1.0    
 */     
public class Native2AsciiUtils {      
  
    /**    
     * prefix of ascii string of native character    
     */     
    private static String PREFIX = "\\u";      
     
    /**    
     * Native to ascii string. It's same as execut native2ascii.exe.    
     * @param str    
     *        native string    
     * @return ascii string    
     */     
    public static String native2Ascii(String str) {      
        char[] chars = str.toCharArray();      
        StringBuilder sb = new StringBuilder();      
        for (int i = 0; i < chars.length; i++) {      
            sb.append(char2Ascii(chars[i]));      
        }      
        return sb.toString();      
    }      
     
    /**    
     * Native character to ascii string.    
     * @param c    
     *            native character    
     * @return ascii string    
     */     
    private static String char2Ascii(char c) {      
        if (c > 255) {      
            StringBuilder sb = new StringBuilder();      
            sb.append(PREFIX);      
            int code = (c >> 8);      
            String tmp = Integer.toHexString(code);      
            if (tmp.length() == 1) {      
                sb.append("0");      
            }      
            sb.append(tmp);      
            code = (c & 0xFF);      
            tmp = Integer.toHexString(code);      
            if (tmp.length() == 1) {      
                sb.append("0");      
            }      
            sb.append(tmp);      
            return sb.toString();      
        } else {      
            return Character.toString(c);      
        }      
    }      
     
    /**    
     * Ascii to native string. It's same as execute native2ascii.exe -reverse.    
     * @param str    
     * ascii string    
     * @return native string    
     */     
    public static String ascii2Native(String str) {      
        StringBuilder sb = new StringBuilder();      
        int begin = 0;      
        int index = str.indexOf(PREFIX);      
        while (index != -1) {      
            sb.append(str.substring(begin, index));      
            sb.append(ascii2Char(str.substring(index, index + 6)));      
            begin = index + 6;      
            index = str.indexOf(PREFIX, begin);      
        }      
        sb.append(str.substring(begin));      
        return sb.toString();      
    }      
     
    /**    
     * Ascii to native character.    
     * @param str    
     * ascii string    
     * @return native character    
     */     
    private static char ascii2Char(String str) {      
        if (str.length() != 6) {      
            throw new IllegalArgumentException("Ascii string of a native character must be 6 character.");      
        }      
        if (!PREFIX.equals(str.substring(0, 2))) {      
            throw new IllegalArgumentException("Ascii string of a native character must start with \"\\u\".");      
        }      
        String tmp = str.substring(2, 4);      
        int code = Integer.parseInt(tmp, 16) << 8;      
        tmp = str.substring(4, 6);      
        code += Integer.parseInt(tmp, 16);      
        return (char) code;      
    }      
     
}     

 

 

  

TimeUtil.java

package tools;   
  
import java.sql.Timestamp;   
import java.text.ParseException;   
import java.text.SimpleDateFormat;   
import java.util.Date;   
import java.util.GregorianCalendar;   
import java.util.Locale;   
  
public class TimeUtil {   
  
       
    /**  
     *   
     * Notes: 格式转换  
     * @param strTime  
     * @return  
     * Created:2010-8-11  
     * @author:Gerry  
     */   
    public static Timestamp getTimeFromString(Object strTime) {   
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.ENGLISH);   
           
        Date date = new Date();   
        if (!strTime.equals("")) {   
            try {   
                String s=strTime.toString();   
                if(s.indexOf(".")!=-1){   
                    if(s.substring(s.indexOf(".")).length()>4){   
                        s=s.substring(0, s.indexOf(".")+4);   
                    }   
                }   
                date = format.parse(s);   
            } catch (ParseException e) {   
                e.printStackTrace();   
            }   
        }   
        Timestamp t = new Timestamp(date.getTime());    
        return t;   
    }   
       
       
    /**  
     * 计算指定的两个时间的时间差数值  
     * @param time  
     * @param anotherTime "2009-12-12 00:55:25.000 "  
     * 前面的时间减去后面的时间  
     * @return  
     */   
    public static long timeDiff2Timestamp(Timestamp time, Timestamp anotherTime) {   
        long timeDiff = 1000;// 时间的差数值   
        timeDiff = time.getTime()-anotherTime.getTime();   
        return timeDiff;   
    }   
       
       
    /**  
     * 当前时间  
     * Notes:TODO Please specify the functions of the method.  
     * @return  
     * Created:2010-8-11  
     * @author:Gerry  
     */   
    public static String getCurrentTimeString() {   
        return getCurrentTimeByFormat("yyyy/MM/dd HH:mm:ss");   
    }   
       
       
    private static String getCurrentTimeByFormat(String format) {   
        GregorianCalendar calendar = new GregorianCalendar();   
        java.util.Date date = calendar.getTime();   
        SimpleDateFormat sformat = new SimpleDateFormat(format);   
        String currentDate = sformat.format(date);   
        return currentDate;   
    }   
       
}   

 

分享到:
评论
4 楼 ling520 2010-09-06  
问题描述:
发送消息时点右键send出现输入框,输入内容后点send发送,第一次弹出一个发送成功的提示确认框,但第二次发送时弹出一个发送确认的提示框后,点确定,又出现一个,第三次出现3个,每次都需点确定,随着发送次数的增加确认次数也在增加,导致一条消息发送多次的情况。
3 楼 ling520 2010-09-06  
亲爱的总结:
1.查看消息后,加一个回复按钮,方便回复;2.发送消息时可以用键盘Enter发送;3.发送消息后致按钮为灰,以免重复提交数据!

看着这段话,我突然第一次感觉你真的是个程序员,呵呵~
2 楼 ling520 2010-09-03  
Mybeautiful 写道
这样就能聊天了,开玩笑吧?另外哪里用javaeye的api了。

的却是可以哦,我们都用好久了,没试过犯不着就怀疑吧??
1 楼 Mybeautiful 2010-09-03  
这样就能聊天了,开玩笑吧?另外哪里用javaeye的api了。

相关推荐

    基于JavaEye-API实现的Gerry-聊天Dos版v1.0-lib库

    NULL 博文链接:https://ago520.iteye.com/blog/814571

    拟阵约束下最大化子模函数的模型及其算法的一种熵聚类方法.pdf

    拟阵约束下最大化子模函数的模型及其算法的一种熵聚类方法.pdf

    电力市场领域中基于CVaR风险评估的省间交易商最优购电模型研究与实现

    内容概要:本文探讨了在两级电力市场环境中,针对省间交易商的最优购电模型的研究。文中提出了一个双层非线性优化模型,用于处理省内电力市场和省间电力交易的出清问题。该模型采用CVaR(条件风险价值)方法来评估和管理由新能源和负荷不确定性带来的风险。通过KKT条件和对偶理论,将复杂的双层非线性问题转化为更易求解的线性单层问题。此外,还通过实际案例验证了模型的有效性,展示了不同风险偏好设置对购电策略的影响。 适合人群:从事电力系统规划、运营以及风险管理的专业人士,尤其是对电力市场机制感兴趣的学者和技术专家。 使用场景及目标:适用于希望深入了解电力市场运作机制及其风险控制手段的研究人员和技术开发者。主要目标是为省间交易商提供一种科学有效的购电策略,以降低风险并提高经济效益。 其他说明:文章不仅介绍了理论模型的构建过程,还包括具体的数学公式推导和Python代码示例,便于读者理解和实践。同时强调了模型在实际应用中存在的挑战,如数据精度等问题,并指出了未来改进的方向。

    MATLAB/Simulink平台下四机两区系统风储联合调频技术及其高效仿真实现

    内容概要:本文探讨了在MATLAB/Simulink平台上针对四机两区系统的风储联合调频技术。首先介绍了四机两区系统作为经典的电力系统模型,在风电渗透率增加的情况下,传统一次调频方式面临挑战。接着阐述了风储联合调频技术的应用,通过引入虚拟惯性控制和下垂控制策略,提高了系统的频率稳定性。文章展示了具体的MATLAB/Simulink仿真模型,包括系统参数设置、控制算法实现以及仿真加速方法。最终结果显示,在风电渗透率为25%的情况下,通过风储联合调频,系统频率特性得到显著提升,仿真时间缩短至5秒以内。 适合人群:从事电力系统研究、仿真建模的技术人员,特别是关注风电接入电网稳定性的研究人员。 使用场景及目标:适用于希望深入了解风储联合调频机制及其仿真实现的研究人员和技术开发者。目标是掌握如何利用MATLAB/Simulink进行高效的电力系统仿真,尤其是针对含有高比例风电接入的复杂场景。 其他说明:文中提供的具体参数配置和控制算法有助于读者快速搭建类似的仿真环境,并进行相关研究。同时强调了参考文献对于理论基础建立的重要性。

    永磁同步电机无感控制:高频方波注入与滑膜观测器结合实现及其应用场景

    内容概要:本文介绍了永磁同步电机(PMSM)无感控制技术,特别是高频方波注入与滑膜观测器相结合的方法。首先解释了高频方波注入法的工作原理,即通过向电机注入高频方波电压信号,利用电机的凸极效应获取转子位置信息。接着讨论了滑膜观测器的作用,它能够根据电机的电压和电流估计转速和位置,具有较强的鲁棒性。两者结合可以提高无传感器控制系统的稳定性和精度。文中还提供了具体的Python、C语言和Matlab代码示例,展示了如何实现这两种技术。此外,简要提及了正弦波注入的相关论文资料,强调了其在不同工况下的优势。 适合人群:从事电机控制系统设计的研发工程师和技术爱好者,尤其是对永磁同步电机无感控制感兴趣的读者。 使用场景及目标:适用于需要减少传感器依赖、降低成本并提高系统可靠性的情况,如工业自动化设备、电动汽车等领域的电机控制。目标是掌握高频方波注入与滑膜观测器结合的具体实现方法,应用于实际工程项目中。 其他说明:文中提到的高频方波注入和滑膜观测器的结合方式,不仅提高了系统的性能,还在某些特殊情况下表现出更好的适应性。同时,附带提供的代码片段有助于读者更好地理解和实践这一技术。

    MATLAB中扩展卡尔曼滤波与双扩展卡尔曼滤波在电池参数辨识的应用

    内容概要:本文深入探讨了MATLAB中扩展卡尔曼滤波(EKF)和双扩展卡尔曼滤波(DEKF)在电池参数辨识中的应用。首先介绍了EKF的基本原理和代码实现,包括状态预测和更新步骤。接着讨论了DEKF的工作机制,即同时估计系统状态和参数,解决了参数和状态耦合估计的问题。文章还详细描述了电池参数辨识的具体应用场景,特别是针对电池管理系统中的荷电状态(SOC)估计。此外,提到了一些实用技巧,如雅可比矩阵的计算、参数初始值的选择、数据预处理方法等,并引用了几篇重要文献作为参考。 适合人群:从事电池管理系统开发的研究人员和技术人员,尤其是对状态估计和参数辨识感兴趣的读者。 使用场景及目标:适用于需要精确估计电池参数的实际项目,如电动汽车、储能系统等领域。目标是提高电池管理系统的性能,确保电池的安全性和可靠性。 其他说明:文章强调了实际应用中的注意事项,如数据处理、参数选择和模型优化等方面的经验分享。同时提醒读者关注最新的研究成果和技术进展,以便更好地应用于实际工作中。

    基于三菱FX3U PLC和威纶通触摸屏的分切机上下收放卷张力控制系统设计

    内容概要:本文详细介绍了在无电子凸轮功能情况下,利用三菱FX3U系列PLC和威纶通触摸屏实现分切机上下收放卷张力控制的方法。主要内容涵盖硬件连接、程序框架设计、张力检测与读取、PID控制逻辑以及触摸屏交互界面的设计。文中通过具体代码示例展示了如何初始化寄存器、读取张力传感器数据、计算张力偏差并实施PID控制,最终实现稳定的张力控制。此外,还讨论了卷径计算、速度同步控制等关键技术点,并提供了现场调试经验和优化建议。 适合人群:从事自动化生产设备维护和技术支持的专业人士,尤其是熟悉PLC编程和触摸屏应用的技术人员。 使用场景及目标:适用于需要对分切机进行升级改造的企业,旨在提高分切机的张力控制精度,确保材料切割质量,降低生产成本。通过本方案可以实现±3%的张力控制精度,满足基本生产需求。 其他说明:本文不仅提供详细的程序代码和硬件配置指南,还分享了许多实用的调试技巧和经验,帮助技术人员更好地理解和应用相关技术。

    基于S7系列PLC与组态王的三泵变频恒压供水系统设计与实现

    内容概要:本文详细介绍了一种基于西门子S7-200和S7-300 PLC以及组态王软件的三泵变频恒压供水系统。主要内容涵盖IO分配、接线图原理图、梯形图程序编写和组态画面设计四个方面。通过合理的硬件配置和精确的编程逻辑,确保系统能够在不同负载情况下保持稳定的供水压力,同时实现节能和延长设备使用寿命的目标。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于需要稳定供水的各种场合,如住宅小区、工厂等。目标是通过优化控制系统,提升供水效率,减少能源消耗,并确保系统的可靠性和安全性。 其他说明:文中提供了详细的实例代码和调试技巧,帮助读者更好地理解和实施该项目。此外,还分享了一些实用的经验教训,有助于避免常见的错误和陷阱。

    三相三线制SVG/STATCOM的Simulink仿真建模与控制策略解析

    内容概要:本文详细介绍了三相三线制静止无功发生器(SVG/STATCOM)在Simulink中的仿真模型设计与实现。主要内容涵盖ip-iq检测法用于无功功率检测、dq坐标系下的电流解耦控制、电压电流双闭环控制系统的设计、SVPWM调制技术的应用以及具体的仿真参数设置。文中不仅提供了理论背景,还展示了具体的Matlab代码片段,帮助读者理解各个控制环节的工作原理和技术细节。此外,文章还讨论了实际调试中遇到的问题及解决方案,强调了参数调整的重要性。 适合人群:从事电力系统自动化、电力电子技术研究的专业人士,特别是对SVG/STATCOM仿真感兴趣的工程师和研究人员。 使用场景及目标:适用于希望深入了解SVG/STATCOM工作原理并掌握其仿真方法的研究人员和工程师。目标是在实践中能够正确搭建和优化SVG/STATCOM的仿真模型,提高无功补偿的效果。 其他说明:文章提供了丰富的实例代码和调试技巧,有助于读者更好地理解和应用所学知识。同时,文中提及的一些经验和注意事项来源于实际项目,具有较高的参考价值。

    基于SIMULINK的风力机发电效率建模探究.pdf

    基于SIMULINK的风力机发电效率建模探究.pdf

    CarSim与Simulink联合仿真:基于MPC模型预测控制实现智能超车换道

    内容概要:本文介绍了如何将CarSim的动力学模型与Simulink的智能算法相结合,利用模型预测控制(MPC)实现车辆的智能超车换道。主要内容包括MPC控制器的设计、路径规划算法、联合仿真的配置要点以及实际应用效果。文中提供了详细的代码片段和技术细节,如权重矩阵设置、路径跟踪目标函数、安全超车条件判断等。此外,还强调了仿真过程中需要注意的关键参数配置,如仿真步长、插值设置等,以确保系统的稳定性和准确性。 适合人群:从事自动驾驶研究的技术人员、汽车工程领域的研究人员、对联合仿真感兴趣的开发者。 使用场景及目标:适用于需要进行自动驾驶车辆行为模拟的研究机构和企业,旨在提高超车换道的安全性和效率,为自动驾驶技术研发提供理论支持和技术验证。 其他说明:随包提供的案例文件已调好所有参数,可以直接导入并运行,帮助用户快速上手。文中提到的具体参数和配置方法对于初学者非常友好,能够显著降低入门门槛。

    基于MATLAB的信号与系统实验:常见信号生成、卷积积分、频域分析及Z变换详解

    内容概要:本文详细介绍了利用MATLAB进行信号与系统实验的具体步骤和技术要点。首先讲解了常见信号(如方波、sinc函数、正弦波等)的生成方法及其注意事项,强调了时间轴设置和参数调整的重要性。接着探讨了卷积积分的两种实现方式——符号运算和数值积分,指出了各自的特点和应用场景,并特别提醒了数值卷积时的时间轴重构和步长修正问题。随后深入浅出地解释了频域分析的方法,包括傅里叶变换的符号计算和快速傅里叶变换(FFT),并给出了具体的代码实例和常见错误提示。最后阐述了离散时间信号与系统的Z变换分析,展示了如何通过Z变换将差分方程转化为传递函数以及如何绘制零极点图来评估系统的稳定性。 适合人群:正在学习信号与系统课程的学生,尤其是需要完成相关实验任务的人群;对MATLAB有一定基础,希望通过实践加深对该领域理解的学习者。 使用场景及目标:帮助学生掌握MATLAB环境下信号生成、卷积积分、频域分析和Z变换的基本技能;提高学生解决实际问题的能力,避免常见的编程陷阱;培养学生的动手能力和科学思维习惯。 其他说明:文中不仅提供了详细的代码示例,还分享了许多实用的小技巧,如如何正确保存实验结果图、如何撰写高质量的实验报告等。同时,作者以幽默风趣的语言风格贯穿全文,使得原本枯燥的技术内容变得生动有趣。

    【KUKA 机器人移动编程】:mo2_motion_ptp_en.ppt

    KUKA机器人相关文档

    永磁同步电机(PMSM)无传感器控制:I/F启动与滑模观测器结合的技术实现及应用

    内容概要:本文详细介绍了无传感器永磁同步电机(PMSM)控制技术,特别是针对低速和中高速的不同控制策略。低速阶段采用I/F控制,通过固定电流幅值和斜坡加速的方式启动电机,确保平稳启动。中高速阶段则引入滑模观测器进行反电动势估算,从而精确控制电机转速。文中还讨论了两者之间的平滑切换逻辑,强调了参数选择和调试技巧的重要性。此外,提供了具体的伪代码示例,帮助读者更好地理解和实现这一控制方案。 适合人群:从事电机控制系统设计的研发工程师和技术爱好者。 使用场景及目标:适用于需要降低成本并提高可靠性的应用场景,如家用电器、工业自动化设备等。主要目标是掌握无传感器PMSM控制的基本原理及其优化方法。 其他说明:文中提到的实际案例和测试数据有助于加深理解,同时提醒开发者注意硬件参数准确性以及调试过程中可能出现的问题。

    智能家居与物联网培训材料.ppt

    智能家居与物联网培训材料.ppt

    Matlab实现车辆路径规划:基于TSP、CVRP、CDVRP、VRPTW的四大算法解析及应用

    内容概要:本文详细介绍了使用Matlab解决车辆路径规划问题的四种经典算法:TSP(旅行商问题)、CVRP(带容量约束的车辆路径问题)、CDVRP(带容量和距离双重约束的车辆路径问题)和VRPTW(带时间窗约束的车辆路径问题)。针对每个问题,文中提供了具体的算法实现思路和关键代码片段,如遗传算法用于TSP的基础求解,贪心算法和遗传算法结合用于CVRP的路径分割,以及带有惩罚函数的时间窗约束处理方法。此外,还讨论了性能优化技巧,如矩阵运算替代循环、锦标赛选择、2-opt局部优化等。 适合人群:具有一定编程基础,尤其是对物流调度、路径规划感兴趣的开发者和技术爱好者。 使用场景及目标:适用于物流配送系统的路径优化,旨在提高配送效率,降低成本。具体应用场景包括但不限于外卖配送、快递运输等。目标是帮助读者掌握如何利用Matlab实现高效的路径规划算法,解决实际业务中的复杂约束条件。 其他说明:文中不仅提供了详细的代码实现,还分享了许多实践经验,如参数设置、数据预处理、异常检测等。建议读者在实践中不断尝试不同的算法组合和优化策略,以应对更加复杂的实际问题。

    软考网络工程师2010-2014真题及答案

    软考网络工程师2010-2014真题及答案完整版 全国计算机软考 适合软考中级人群

    基于单片机的酒驾检测设计(51+1602+PCF8591+LED+BZ+KEY3)#0055

    包括:源程序工程文件、Proteus仿真工程文件、论文材料、配套技术手册等 1、采用51/52单片机作为主控芯片; 2、采用1602液晶显示:测量酒精值、酒驾阈值、醉驾阈值; 3、采用PCF8591进行AD模数转换; 4、LED指示:正常绿灯、酒驾黄灯、醉驾红灯; 5、可通过按键修改酒驾醉驾阈值;

    基于MATLAB的拉格朗日函数与SQP二次规划方法实现约束最优化求解

    内容概要:本文详细介绍了利用MATLAB实现约束最优化求解的方法,主要分为两大部分:无约束优化和带约束优化。对于无约束优化,作者首先讲解了梯度下降法的基本原理和实现技巧,如步长搜索和Armijo条件的应用。接着深入探讨了带约束优化问题,特别是序列二次规划(SQP)方法的具体实现,包括拉格朗日函数的Hesse矩阵计算、QP子问题的构建以及拉格朗日乘子的更新策略。文中不仅提供了详细的MATLAB代码示例,还分享了许多调参经验和常见错误的解决办法。 适合人群:具备一定数学基础和编程经验的研究人员、工程师或学生,尤其是对最优化理论和应用感兴趣的读者。 使用场景及目标:适用于需要解决各类优化问题的实际工程项目,如机械臂能耗最小化、化工过程优化等。通过学习本文,读者能够掌握如何将复杂的约束优化问题分解为更易处理的二次规划子问题,从而提高求解效率和准确性。 其他说明:文章强调了优化算法选择的重要性,指出不同的问题结构决定了最适合的算法。此外,作者还分享了一些实用的经验教训,如Hesse矩阵的正定性处理和惩罚因子的动态调整,帮助读者少走弯路。

Global site tag (gtag.js) - Google Analytics