您的位置:首页 > 理论基础 > 计算机网络

android客户端与部署到tomcat的servlet服务器之间实现http通信

2015-10-28 19:18 691 查看
博主目前小白,为了完成这个踩到不少地雷,在此处记录下,可能错误忘记了,以后想起来再更新。

服务器端:

public class Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getOutputStream().print("This is Servlet ");
}
}
}




在tomcat上部署项目时,输入http://localhost:8080/项目名称/servlet名称,看到自己的写的servlet就成功了,如果出现500错误,描述里说是过滤器什么的,很大的原因是缺少包,少什么导入什么就行。

不要忘记在web.xml中创建servlet

<servlet>
<servlet-name>Servlet</servlet-name>//就是那个继承httpservlet的类名
<servlet-class>com.example.Servlet</servlet-class>//那个servlet类的在scr下的文件地址
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/Servlet</url-pattern>//也是类名。不要忘了斜杠
</servlet-mapping>


这就好了。有关tomcat 和eclipse 的配置就不多说了,百度下教程很多。

下面是android客户端:

public class MainActivity extends Activity {
private TextView textView;
private connect connectThread;
private String result1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
connectThread = new connect();
connectThread.start();
try {
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}


这里要重点说明的是那个connect类的对象connectThread,可以看出这是个线程。

之所以建个子线程是因为刚开始我直接在onCreate里连接的时候一直被堵塞导致app挂掉。。就是刷到真机上点开就闪退。查过很多资料,也有很多人发了跟我一样的问题。我最终是用子线程的方式解决的。

因为很多人是看书或者是一些老的demo学习的,所以会进入困境,由于sdk升级,android4.3以上的手机好像不能在主线程里进行网络操作。

下面是子线程类:

public class connect extends Thread {
int count = 0;
private String string_url = "http://172.27.163.4:8080/http_server/Servlet";//ip 要自行修改 手机和电脑在同一个局域网下。因为我没有可用的外网服务器,是将PC作为服务器的。
private URL url = null;
String result;
String readline;
public connect() {
super();
System.out.println("创建子线程end");
}
public void run() {
super.run();
System.out.println("get方法begin");
this.getconnect();
System.out.println("get方法end");
//count++;
//System.out.println("" + count);这两行我刚开始是为了测试这个线程的执行情况的。因为还是新手,多试试能记得牢
}
public void getconnect() {
try {
url = new URL(string_url);
System.out.println("11111111111");
HttpURLConnection connect_url = (HttpURLConnection) url.openConnection();
connect_url.setDoOutput(true);
connect_url.setDoInput(true);
connect_url.setConnectTimeout(10000);
connect_url.setRequestMethod("GET");
connect_url.connect();
System.setProperty("http.keepAlive", "false");

InputStreamRead
4000
er in = new InputStreamReader(connect_url.getInputStream(), "utf-8");
System.out.println("22222222222");
BufferedReader reader = new BufferedReader(in);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
reader.close();
result = sb.toString();
in.close();
connect_url.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


可能会比较乱,有很多没提到。

像,我写这个的时候用了json解析。代码没贴上来,时间关系,下次再更新。android端的json 我开始的时候犯了个错误,原来服务器端的json的包是导入的。我顺手也导入了android端,结果闪退了,原因是android自己本身就是有关于json的jar的,两个包同时存在的话里面的类会打架导致出错。删掉后来导进去的就好了。

还碰到一些问题,我后续学习中有想起来的话就再加进去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: