在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的本地项目也需要配置类似于这种权限之类的东西呢?

2 个解决方案

#1


为了方便各位引用相关出错代码,分别将Android端、Java项目、服务器端的主要代码粘贴过来,望大神指正!



一、服务器端


request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

InputStreaminputStream=request.getInputStream();
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(inputStream,"utf-8"));


Gsongson=newGson();

requestState=bufferedReader.read();

PrintUtil.printState("requestState",requestState);

StringBuilderstringBuilder=newStringBuilder();
StringperLine;
while((perLine=bufferedReader.readLine())!=null){
stringBuilder.append(perLine);
}




二、Android端


URLurl=newURL("http://10.0.116.135:8080/LMS/servlet/LMSServlet");
HttpURLConnectionconn=(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");

OutputStreamoutputStream=conn.getOutputStream();
OutputStreamWriteroutputStreamWriter=newOutputStreamWriter(outputStream,"utf-8");
BufferedWriterbufferedWriter=newBufferedWriter(outputStreamWriter);

bufferedWriter.write(sendCode);
bufferedWriter.write(gson.toJson(testBean,TestBean.class));

bufferedWriter.flush();
bufferedWriter.close();
outputStream.flush();
outputStream.close();




三、Java项目


URLurl=newURL("http://10.0.116.135:8080/LMS/servlet/LMSServlet");
HttpURLConnectionconn=(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");
/*
**/

OutputStreamoutputStream=conn.getOutputStream();
OutputStreamWriteroutputStreamWriter=
newOutputStreamWriter(outputStream,"utf-8");
BufferedWriterbufferedWriter=
newBufferedWriter(outputStreamWriter);


bufferedWriter.write(50);

TestBeantestBean=newTestBean();
testBean.testResult="request";
bufferedWriter.write(newGson().toJson(testBean,TestBean.class));
System.out.println("Connecting!");

//System.out.println(conn.getResponseCode());

bufferedWriter.flush();
bufferedWriter.close();
outputStream.flush();
outputStream.close();







可以看到Android端和Java项目代码基本上是一毛一样呀

更多相关文章

  1. 给自己的项目做极光推送的步骤
  2. Android Studio 项目的导入以及依赖
  3. 从零开始的Android新项目2 - Gradle篇
  4. 使用Android库项目设置ProGuard
  5. android studio如何把本地项目上传到git@osc
  6. Libgdx设置UI在新GWT项目中出现2个意外错误
  7. Android网络编程-----从服务器端获取xml数据并解析
  8. JustWe-WebServer Android上的Http服务器
  9. Android SDK更新以及ADT更新出现问题的解决办法(附google服务器

随机推荐

  1. android重用layout-include标签的使用
  2. 准备去实习了,java后端开发和android都学
  3. Android(安卓)引用外部项目库
  4. [Android(安卓)之美] 那些你不知道的APK
  5. [学习]创建一个Android工程
  6. Android SDK Manager更新不了的解决办法
  7. android 更改密码显示风格
  8. Linux Kernel and Android(安卓)休眠与唤
  9. Android ADT和SDK历史版本离线包下载地址
  10. 安卓巴士Android开发神贴