使用HttpURLConnection和Servlet传输json

来源:互联网 发布:青岛seo顾问公司 编辑:程序博客网 时间:2024/06/04 23:23

客户端Exception
java.io.IOException: Server returned HTTP response code: 500 at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
服务器端Exception
java.lang.ClassNotFoundException: net.sf.json.JSONObject

这是我最近遇到的两个Exception,其实是同一个问题导致的。当然,同样的Exception也所对应的源问题也不是唯一的,所以如果我的方法没有解决各位的问题,各位还是要继续百度啦。

解决办法检查是否将Servlet依赖的jar放到了Tomcat的lib目录下。


安卓客户端和服务器端的通信方式有多种:URLConnection,HttpClient,,HttpURLConnection。

最近做比赛项目,队友开发安卓用Android Studio,我一直用的eclipse。没办法,只能我妥协一下了,老老实实把AS装上了。

我把服务器端注册登录的servlet写好以后,想随便写个app测试下。开始用HttpClient通信,然后AS说不认识HttpClient。好吧那我手写导进apache包来,结果HttpClient给我划了道横线,deprecated。百度了一下,说AS推荐使用HttpURLConnection来代替HttpClient

好吧那我就用HttpURLConnection。客户端代码(HttpURLConnection传输json)大概是这样的:

            JSONObject  obj = new JSONObject();            obj.put("name", name);            obj.put("pwd", pwd);            URL url = new URL("http://XXXXXXXXXXXXXXXX");            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setDoOutput(true);            conn.setDoInput(true);            conn.setUseCaches(false);            conn.setRequestMethod("POST");            conn.setRequestProperty("Connection", "Keep-Alive");            conn.setRequestProperty("Charset", "UTF-8");            conn.setRequestProperty("contentType", "application/json");            conn.connect();            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());            // 发送给服务器            writer.write(obj.toString());            writer.flush();            writer.close();            //接收服务器返回信息            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")) ;            String line;            StringBuilder sb = new StringBuilder();            while ((line = br.readLine()) != null) {                sb.append(line);            }                    conn.disconnect();

服务器端Servlet代码:

        //接收客户端信息        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8")) ;        String line;        StringBuilder sb = new StringBuilder();        while ((line = br.readLine()) != null) {            sb.append(line);        }                JSONObject json = JSONObject.fromObject(sb.toString());        String name=null;        String pwd = null;        if (json != null) {              JSONObject jo = JSONObject.fromObject(json);              id = jo.getString("name");            password = jo.getString("pwd");        }           String result = "success";        String reason = null;        try{            //数据库操作         }catch(Exception e){            reason = "数据库操作失败!";            result = "failed";            e.printStackTrace();        }        //返回给客户端信息        response.setCharacterEncoding("UTF-8");         response.setContentType("application/json;charset=UTF-8");        PrintWriter out = response.getWriter();        JSONObject jsonObject = new JSONObject();          jsonObject.put("result", result);        jsonObject.put("reason", reason);        out.write(jsonObject.toString());        out.flush();        out.close();

然后就开始出错了:点击登录按钮app就退出。开始看日志信息,似乎是个服务器端内部错误500,而且在安卓客户端conn.getInputStream()这里报错。

之后直接把app登录代码抽出来了,放在一个Java文件里测试(因为放在app里安装运行测试好麻烦)。还是服务器端500。

之后各种百度呀,我的服务器端代码和人家的也没啥区别啊,就接收个json,然后返回个信息啊。

然后,我索性在本地直接运行服务器端servlet,就报了java.lang.ClassNotFoundException: net.sf.json.JSONObject
可是这个包我明明导入了啊,然后继续百度,发现,需要把依赖的jar包放到Tomcat的lib目录下。我真是醉了。
照做了之后,这个问题终于解决了。

然后代码放回app里,做了个TextView显示服务器返回的信息,结果死活不显示,查看日志:恍恍惚惚看到了个handle,忽然想到,Android更新个UI怎么也得用个Handler啊!

0 0
原创粉丝点击