使用HttpURLConnection和Servlet传输json

客户端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啊!

你可能感兴趣的:(通信)