目录结构如下:
--bean
----------MessageBean.java
----------ReceiveBean.java
----------SenderBean.java
---je
----------ClientUtilsMain.java
----------ReadThread.java
---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;
}
}
ClientUtilsMain.java
package je;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
import org.apache.http.client.ClientProtocolException;
import tools.ClientUtils;
import tools.Native2AsciiUtils;
import tools.TimeUtil;
import bean.MessageBean;
/**
*
* Notes:Main Class
* Created:2010-8-9
* @author:Gerry
* @version:1.0
*/
public class ClientUtilsMain {
/*User param setting*/
private static String user_name = "11" ;
private static String user_pass = "11" ;
private static String receive_name = "11" ;
private static boolean isproxy = true ;
private static final String NOTICE_STR = "Notice: `.refresh; 1.shownew ; 2.send ;3.history; 4.cls screen ; 5.help ; 6.exit" ;
/*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" ;
/**
* @param args
* @throws Exception
* @throws Exception
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
System.out.println("please input your username:");
BufferedReader stdin1 =new BufferedReader(new InputStreamReader(System.in));
String str1=stdin1.readLine();
if(!str1.equals("")){user_name = str1 ;}
System.out.println("please input your password:");
String str2=stdin1.readLine();
if(!str2.equals("")){user_pass = str2 ;}
System.out.println("please input your receivename:");
String str3=stdin1.readLine();
if(!str3.equals("")){receive_name = str3 ;}
clsScreen();
showNotice();
//Read line
ReadThread readThread = new ReadThread();
readThread.start();
while(true){
System.out.println("+++++++++++++++++++++++++++++++++++");
String str=stdin1.readLine();
if(str!=null){
if(str.equals("`") || str.equals("refresh")){
receiveNewMessage();
}
if(str.equals("1")){
showLastListMsg();
}
if(str.equals("2")){
System.out.println("please wait...");
sendMessage();
clsScreen();
showNotice();
}
if(str.equals("3")){
System.out.println("please wait...");
receiveMessage();
}
if(str.equals("4") || str.equals("cls")){
//Process k = Runtime.getRuntime().exec("cmd /c cls");
clsScreen();
}
if(str.equals("5") || str.equals("help")){
showNotice();
}
if(str.equals("6") || str.equals("exit")){
readThread.stop();
break;
}
}
}
}
public static List<MessageBean> showLastListMsg(){
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();//取最后一条记录的时间
}
System.out.println("No."+(i+1)+": ["+bean.getCreated_at()+"] "+bean.getSender().getName()+" :"+bean.getPlain_body());
}
for(int i=0;i<listBean.size();i++){
listBean.remove(i);
i--;
}
return listBean ;
}
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);
for(int i=0;i<beans.length;i++){
System.out.println("No."+(i+1)+": ["+beans[i].getCreated_at()+"] "+beans[i].getSender().getName()+" :"+beans[i].getPlain_body());
}
return Native2AsciiUtils.ascii2Native(strResult);
}
public static int receiveNewMessage(){
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();
}
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]);
}
}
if(listBean.size()>0){
System.out.println("Notice: There is "+listBean.size()+" to press 1 shownew!");
}
return 1 ;
}
public static String sendMessage() throws Exception {
String str=null;
String strResult = null;
System.out.println("Please input the text:");
BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
str=stdin.readLine();
try {
//The third param is true for proxy,false for no proxy .
strResult = ClientUtils.getJsonContent("api.iteye.com","api/messages/create?title=Message:&receiver_name="+receive_name+"&body="+str, user_name,user_pass,isproxy);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(Native2AsciiUtils.ascii2Native(strResult));
return "" ;
}
public static String showNotice(){
System.out.println(NOTICE_STR);
return "" ;
}
public static String clsScreen(){
for(int i=0;i<10;i++){
System.out.println("");
}
return "" ;
}
}
ReadThread.java
package je;
public class ReadThread extends Thread{
public long times = 30000L ; //30000ms
public ReadThread(){}
@SuppressWarnings("static-access")
public void run() {
while(true){
ClientUtilsMain.receiveNewMessage();//程序后台接收数据
try {
this.sleep(times);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
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;
}
}