在MyEclipse下创建了一个Servlet并通过Tomcat部署,然后在另一台电脑的Eclipse里新建了一个本地Java项目,服务器与Java项目通过Wifi连接在同一个局域网内,通过这个本地项目访问Servlet服务器,连接是成功的,可是通过bufferedWriter.write()发送任意数据,在Servlet里bufferedReader.read()得到的始终是-1,也就是说明项目发送的数据为空,但是用Android同样连接到这个Servlet并且发送数据就能接收到,这是怎么回事呢?
 
  以上是图一
图一是用Android连接服务器的核心代码部分,其中sendCode变量的值就是9901,服务器也确实成功接收到了这个值并进行处理
   
 
  以上是图二
图二是用本地Java项目访问服务器,从建立连接到发送请求码和一个Json数据流这一部分都是一模一样的,为什么服务器read得到的是-1呢?也就是代表没有发送任何数据?但是Java项目getResponseCode得到的值为200,并且服务器能响应一个-1,也说明连接建立成功了,那么为什么BufferedWriter.write()这一步的数据就是发布出去呢?
  
   
 以上是图三
在进一步测试中,我发现不论我BufferedWriter.write()几次,服务器都只响应一次-1,于是我去掉了geResponseCode,惊讶的发现服务器居然就毫无反应了,也就是说之前获得的-1仅仅是getResponseCode这一步,在得到服务器连接状态时对服务器的访问给服务器了一个请求,也就是类似于用网页访问这个Servlet时,服务器会响应并且得到的请求码是-1(因为用网页访问时没有发送任何数据),所有想请问各路大神,为什么这里的BufferedWriter.write()无法发送数据出去呢?而Android端却可以成功发送呢?莫非是这种连接服务器的方式只能用于Android端?但是我在网上查找别人写的Java客户端和服务器连接时确实有用这种连接方式的,Android在进行服务器连接时需要添加联网权限,是不是Java的本地项目也需要配置类似于这种权限之类的东西呢?

解决方案 »

  1.   

    为了方便各位引用相关出错代码,分别将Android端、Java项目、服务器端的主要代码粘贴过来,望大神指正!
       
     
      
    一、服务器端
       request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");

    InputStream inputStream = request.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));


    Gson gson = new Gson();

    requestState = bufferedReader.read();

    PrintUtil.printState("requestState",requestState);

    StringBuilder stringBuilder = new StringBuilder();
    String perLine;
    while((perLine = bufferedReader.readLine()) != null) {
    stringBuilder.append(perLine);
    }  
       
     
    二、Android端
              URL url = new URL("http://10.0.116.135:8080/LMS/servlet/LMSServlet");
            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");        OutputStream outputStream = conn.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "utf-8");
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);        bufferedWriter.write(sendCode);
            bufferedWriter.write(gson.toJson(testBean, TestBean.class));        bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.flush();
            outputStream.close(); 
      
       
    三、Java项目
              URL url = new URL("http://10.0.116.135:8080/LMS/servlet/LMSServlet");
            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");
                        /*
                        * */        OutputStream outputStream = conn.getOutputStream();
            OutputStreamWriter outputStreamWriter =
             new OutputStreamWriter(outputStream, "utf-8");
            BufferedWriter bufferedWriter =
             new BufferedWriter(outputStreamWriter);
            
     
            bufferedWriter.write(50);        TestBean testBean = new TestBean();
            testBean.testResult = "request";
            bufferedWriter.write(new Gson().toJson(testBean,TestBean.class));
            System.out.println("Connecting !");
            
    //        System.out.println(conn.getResponseCode());
            
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.flush();
            outputStream.close(); 
        
      
       
         
      
    可以看到Android端和Java项目代码基本上是一毛一样呀