Android作为客户端,PC作为服务端:实现网络通信
2016-07-05 11:53
573 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
此项目实现网络通信,android手机客户端去请求PC服务端,将PC上mysql中的数据显示在手机上。
PC服务端用JavaWeb写了个servlet,android手机客户端请求这个servlet,由servlet执行查询数据,并返回给手机客户端,服务器为Tomcat。
为了更清楚的展示,咱们现在mysql建一个测试表test
[plain] view
plain copy
create table test(
name varchar(20) primary key
);
插入几条记录,我们这里插入汉字,遇到乱码,我们可以去解决。
[plain] view
plain copy
insert into test values('张三');
insert into test values('李四');
insert into test values('王五');
插入成功
闲话少说,直接上代码:
DBManager.java
[plain] view
plain copy
package com.njue.DBManager;
import java.awt.List;
import java.sql.*;
import java.util.ArrayList;
import org.omg.CORBA.Object;
public class DBManager {
;
String userName="root";
String password="123456";
Connection conn=null;
Statement stmt=null;
String url="jdbc:mysql://localhost:3306/mysql";
ArrayList<String> list=new ArrayList<String>();
String sql;
public DBManager(){
sql="select * from test;";
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url,userName,password);
stmt=conn.createStatement();
ResultSet rst=stmt.executeQuery(sql);
while(rst.next()){
//String name=new String(rst.getString("name").getBytes("latin1"), "UTF-8");
String name=new String(rst.getString("name").getBytes("latin1"), "GB2312");// 这句可要可不要,以你不出现乱码为准
//也可不用转化,直接写成String name=rst.getString("name");
list.add(name);
}
rst.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<String> getList(){
return list;
}
}
plain copy
package com.amaker.servlet;
import java.awt.List;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.njue.DBManager.DBManager;
public class loadMessage extends HttpServlet {
public loadMessage() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8" );
PrintWriter out = response.getWriter();
String message="";
DBManager db=new DBManager();
ArrayList<String> list=db.getList();
for(int i=0;i<list.size();i++){
message=message+list.get(i)+"\r\n";
}
out.print(message);
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
public void init() throws ServletException {
// Put your code here
}
}
[plain] view
plain copy
package com.njue.androidClient;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class AndroidClientActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv=(TextView)findViewById(R.id.tv);
// 查询返回结果
String result = HttpUtil.queryStringForPost("http://10.0.2.2:8080/androidWeb/servlet/loadMessage");
//String result = HttpUtil.queryStringForPost("http://122.88.34.123:8080/androidWeb/servlet/loadMessage");
tv.setText(result);
}
}
HttpUtil.java
[plain] view
plain copy
package com.njue.androidClient;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class HttpUtil {
// 基础URL
// 获得Get请求对象request
public static HttpGet getHttpGet(String url){
HttpGet request = new HttpGet(url);
return request;
}
// 获得Post请求对象request
public static HttpPost getHttpPost(String url){
HttpPost request = new HttpPost(url);
return request;
}
// 根据请求获得响应对象response
public static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{
HttpResponse response = new DefaultHttpClient().execute(request);
return response;
}
// 根据请求获得响应对象response
public static HttpResponse getHttpResponse(HttpPost request) throws ClientProtocolException, IOException{
HttpResponse response = new DefaultHttpClient().execute(request);
return response;
}
// 发送Post请求,获得响应查询结果
public static String queryStringForPost(String url){
// 根据url获得HttpPost对象
HttpPost request = HttpUtil.getHttpPost(url);
String result = null;
try {
// 获得响应对象
HttpResponse response = HttpUtil.getHttpResponse(request);
// 判断是否请求成功
if(response.getStatusLine().getStatusCode()==200){
// 获得响应
result = EntityUtils.toString(response.getEntity());
//result=new String(result.getBytes("8859_1"),"GB2312"); 这句可要可不要,以你不出现乱码为准
return result;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
result = "网络异常!";
return result;
} catch (IOException e) {
e.printStackTrace();
result = "网络异常!";
return result;
}
return null;
}
}
当然还得在AndroidManifest.xml中加入网络访问权限:
[plain] view
plain copy
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
需要注意的写服务器的主机号时,千万不能写localhost或者127.0.0.1,因为Android模拟器虽然和服务端程序在同一台电脑上,但两个毕竟是独立的系统,我们可以用10.0.2.2去访问本机。
运行结果:
目录(?)[+]
此项目实现网络通信,android手机客户端去请求PC服务端,将PC上mysql中的数据显示在手机上。
PC服务端用JavaWeb写了个servlet,android手机客户端请求这个servlet,由servlet执行查询数据,并返回给手机客户端,服务器为Tomcat。
为了更清楚的展示,咱们现在mysql建一个测试表test
[plain] view
plain copy
create table test(
name varchar(20) primary key
);
插入几条记录,我们这里插入汉字,遇到乱码,我们可以去解决。
[plain] view
plain copy
insert into test values('张三');
insert into test values('李四');
insert into test values('王五');
插入成功
闲话少说,直接上代码:
PC服务端
我用MyEclipse建立了一个JavaWeb项目,这个项目中主要由一个数据查询类DBManager.java和一个servlet(loadMessage.java)组成DBManager.java
[plain] view
plain copy
package com.njue.DBManager;
import java.awt.List;
import java.sql.*;
import java.util.ArrayList;
import org.omg.CORBA.Object;
public class DBManager {
;
String userName="root";
String password="123456";
Connection conn=null;
Statement stmt=null;
String url="jdbc:mysql://localhost:3306/mysql";
ArrayList<String> list=new ArrayList<String>();
String sql;
public DBManager(){
sql="select * from test;";
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url,userName,password);
stmt=conn.createStatement();
ResultSet rst=stmt.executeQuery(sql);
while(rst.next()){
//String name=new String(rst.getString("name").getBytes("latin1"), "UTF-8");
String name=new String(rst.getString("name").getBytes("latin1"), "GB2312");// 这句可要可不要,以你不出现乱码为准
//也可不用转化,直接写成String name=rst.getString("name");
list.add(name);
}
rst.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<String> getList(){
return list;
}
}
loadMessage.java
[plain] viewplain copy
package com.amaker.servlet;
import java.awt.List;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.njue.DBManager.DBManager;
public class loadMessage extends HttpServlet {
public loadMessage() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8" );
PrintWriter out = response.getWriter();
String message="";
DBManager db=new DBManager();
ArrayList<String> list=db.getList();
for(int i=0;i<list.size();i++){
message=message+list.get(i)+"\r\n";
}
out.print(message);
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
public void init() throws ServletException {
// Put your code here
}
}
Android手机客户端代码:
AndroidClientActivity.java[plain] view
plain copy
package com.njue.androidClient;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class AndroidClientActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv=(TextView)findViewById(R.id.tv);
// 查询返回结果
String result = HttpUtil.queryStringForPost("http://10.0.2.2:8080/androidWeb/servlet/loadMessage");
//String result = HttpUtil.queryStringForPost("http://122.88.34.123:8080/androidWeb/servlet/loadMessage");
tv.setText(result);
}
}
HttpUtil.java
[plain] view
plain copy
package com.njue.androidClient;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class HttpUtil {
// 基础URL
// 获得Get请求对象request
public static HttpGet getHttpGet(String url){
HttpGet request = new HttpGet(url);
return request;
}
// 获得Post请求对象request
public static HttpPost getHttpPost(String url){
HttpPost request = new HttpPost(url);
return request;
}
// 根据请求获得响应对象response
public static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{
HttpResponse response = new DefaultHttpClient().execute(request);
return response;
}
// 根据请求获得响应对象response
public static HttpResponse getHttpResponse(HttpPost request) throws ClientProtocolException, IOException{
HttpResponse response = new DefaultHttpClient().execute(request);
return response;
}
// 发送Post请求,获得响应查询结果
public static String queryStringForPost(String url){
// 根据url获得HttpPost对象
HttpPost request = HttpUtil.getHttpPost(url);
String result = null;
try {
// 获得响应对象
HttpResponse response = HttpUtil.getHttpResponse(request);
// 判断是否请求成功
if(response.getStatusLine().getStatusCode()==200){
// 获得响应
result = EntityUtils.toString(response.getEntity());
//result=new String(result.getBytes("8859_1"),"GB2312"); 这句可要可不要,以你不出现乱码为准
return result;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
result = "网络异常!";
return result;
} catch (IOException e) {
e.printStackTrace();
result = "网络异常!";
return result;
}
return null;
}
}
当然还得在AndroidManifest.xml中加入网络访问权限:
[plain] view
plain copy
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
需要注意的写服务器的主机号时,千万不能写localhost或者127.0.0.1,因为Android模拟器虽然和服务端程序在同一台电脑上,但两个毕竟是独立的系统,我们可以用10.0.2.2去访问本机。
运行结果:
相关文章推荐
- 关于Http的七个误解
- Https 公钥、私钥、证书
- TCP/IP协议栈传输层协议(TCP/UDP)
- https小结
- centos 搭建 httpd 服务器 以及配置多域名 反向代理
- 读书笔记-java网络编程-5URL和URI-x-www-form-urlencoded
- TCP /IP 协议-隧道机制
- 基于线程池的http服务器
- OSI七层协议和TCP/IP四层协议之比较
- linux C 网络编程基础
- 读书笔记-java网络编程-5URL和URI-URI类
- cordova支持私人HTTPS证书
- httpclient post
- 【Netty4.X】Unity客户端与Netty服务器的网络通信(一)
- uefi与win8 (根据网络资料整理)
- python学习:编写TCP服务器&UDP服务器
- 【百宝云网络验证】—易语言开发的系统
- 通信网络基础总结
- mysql-5.7.5-labs-http-documentation中文翻译-第三章 安装
- eclipse Exception in thread "http-bio-8080-exec-2" java.lang.OutOfMemoryError: PermGen space