ProgramVAE 2014-04-03
Android使用Java Web服务器作为中转实现即时通信
白白浪费掉的今天,是我们向往的明天,是我们悔恨的昨天。~~~~~~~~~~与汝共勉
我相信一个人的时间按天计算和按秒计算其效果的差别是巨大的,我们应该相信上帝赋予我们足够的时间来让我们变得睿智,成熟。但是我们的时间又是不够的,因为我们要做的事好多好多。但是有时候又不知道自己该干什么,我能为别人带来什么,或者我又可以收获什么。自己或许还并不是一个程序员,但是我并不想把编程只看做Code,我在做的是Program。我希望我可以去做很伟大的事情,但是有时候又很害怕。其实那又有什么呢,尝试是一件多么令人心动的事啊。
我感觉我不能说的太多了,要不然会滔滔不绝偏离主题的。最近一个人没事在搞一个聊天的模块,因为想要这个模块真正的变得有价值,加上我们这些学习爱好者并没有服务器的原因,云服务器并不提供我们编写Socket程序所需要的端口,于是我的这个模块就显得很长有意义了。这个模块其实很简单,只不过由于本人能力有限,还是中间出了点差错,错误调试了好久才得以实现,不过还好我这人挺豁达的。不跟程序较劲,所以后来还是慢慢的完成了这个模块成功交差。
这个实现的思想就是:
发送消息时:客户端发一个http请求,将用户名加上接收方的名字和发送的消息放在座位请求参数发送给服务器。这个功能实现起来较为简单。
接受消息:这个过程实现起来相对会比较麻烦一点点,但是也没几行代码就可以解决了。
思想就是客户端每隔一段时间就去访问一下服务器,想服务器问问有没有我的消息,有的话就把消息带回去。
首先贴下java web服务器端的代码:
public class CoreServlet extends HttpServlet { Map<String, String> mapMessage = new HashMap<String, String>(); private PrintWriter out; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); request.setCharacterEncoding("UTF-8"); // 取得请求者名称 String strReqName = request.getParameter("name"); // 取得请求者状态 String strState = request.getParameter("state"); // 如果状态是登录 if (strState.equals("load")) { String strRep = "load success"; System.out.println(strReqName + "登录"); // 向客户端回应登录成功 out = response.getWriter(); out.write(strRep); } // 如果状态是发送 else if (strState.equals("sendMsg")) { // 取得发送至的名字 String strSendToName = request.getParameter("toName"); // 得到信息 String strMsg = request.getParameter("Msg"); // 回应请求客户端信息 String strSendMsg = strReqName + " send to " + strSendToName + " message: \n" + strMsg; System.out.println(strSendMsg); // 将信息和发送至的名字和相对应的信息放在Map表中 mapMessage.put(strSendToName, strSendMsg); } // 如果状态是获得信息 else if (strState.equals("getMsg")) { out = response.getWriter(); // 送map中取得信息 String strMessage = mapMessage.get(strReqName); System.out.println(strReqName + "------>" + strMessage); // 判断信息是否存在 if (strMessage != null && !strMessage.equals("")) { // 存在则将信息发给请求客户端 out.write(strMessage); out.flush(); System.out.println("移除消息"); // 将消息从消息队列中移除,防止消息返回发送 mapMessage.put(strReqName, ""); } } } }
再看我们的客户端,也就是Android端的程序的代码:
这是一个登陆界面,用来实现用户登录过程。