今天做了个android与sea服务器相互通信的小项目,发现并不是很困难,只有几行代码就可以实现了。
第一步:
在android主页,一定要在onCreate函数里面的super.onCreate(savedInstanceState);之前加上下面两句
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
,对应的头文件是 import android.os.StrictMode; (并不用导入什么包的)。
通过下面的按钮来调用与服务器相连并获取数据:
(记得设置权限 <uses-permission android:name="android.permission.INTERNET" /> 并且<uses-sdk android:minSdkVersion="8" />)
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String url = "URL(服务器地址)";
String name = "220202051011";
String pwd = "123456";
String flag = xin.save_pw(url, name, pwd);(调用下面的类的函数)
if(!flag.equals("no")){
Toast.makeText(LinkActivity.this, flag, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(LinkActivity.this, flag, Toast.LENGTH_LONG).show();
}
}
});
第二步:
设置数据,并通过ArrayList来传输数据(post方式),
public ArrayList<NameValuePair> init(String Name, String pw) {//这个函数用来初始化数组列表ArrayList
ArrayList<NameValuePair> name = new ArrayList<NameValuePair>();//定义一个键值对来行的数组容器
if(Name!=null){
name.add(new BasicNameValuePair("name", Name));//这里设置php文件接收的Order,例如 $_REQUEST["Order"],根据你的php自己定义的来写
}
if(pw!=null){
name.add(new BasicNameValuePair("pw", pw));//上面我定义了一个mysql命令,这里是数据库名字,两个由参数传入,增加了灵活性
}
return name;//返回设置好了容器
}
public String save_pw(String url,String name, String pw) {
String k = "no";
InputStream GetContentFromDb = null;//定义一个保存输入流的变量
try {
HttpClient http = new DefaultHttpClient();//开启http服务
HttpPost post = new HttpPost(url);//传入url,初始化要post数据的url
post.setEntity(new UrlEncodedFormEntity(init(name, pw)));//这里发送数据,看到init()函数的调用没
HttpResponse response = http.execute(post);//这里才正真地进行访问,带着上面设置的数据
HttpEntity responseFromDb = response.getEntity();//接受返回的实体
GetContentFromDb = responseFromDb.getContent();//接受实体内容,并保存到输入流对象中
Log.i("aaaaaaa","STATA");
if(GetContentFromDb!=null){
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(GetContentFromDb, "UTF-8"), 8);
//上面的这句作用是把输入流里面的内容进行编码,第二个最好设置UTF-8,要和你的mysql表的一样,如果用iso-8859-1可能会抛出乱码错误
StringBuilder info = new StringBuilder();//定义字符容器
String line = null;//用来保存提取出的每行数据
while ((line = reader.readLine()) != null) {//保证读到的每行数据不为null
info.append(line + "\n");//每行相加
}
GetContentFromDb.close();//关闭
result = info.toString();//数据转化
System.out.println(result);
} catch (Exception e) {
Log.i("second exception",e.toString());
}
try {
k = "";
//把数据php的json数据放回到这里,记住,你php最后输出的一定要是json数据,否则,这里会抛出异常
JSONArray jArray = new JSONArray(result);
if (jArray.length() > 0) {//是否有数据
rowNum = jArray.length();//获取行数,并保存
// k = rowNum+"";
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);//逐行获取接受回来的json数据
k += json_data.getString("id")+" ";
k += json_data.getString("username")+" ";
Log.i("xxxxxxxxxxxx",k);
}
}
} catch (Exception e) {
Log.i("three exception",e.toString());
}
//k = "yes";
return k;
}
} catch (Exception e) {
Log.i("tag", e.toString());
}
return k;
}
第三步:
PHP服务器上的代码:
<?php
$conn=mysql_connect(SAE_MYSQL_HOST_M.‘:‘.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); //配置数据库
if (!$conn)
{
die("Connect Server Failed:".mysql_error());
}
if(!mysql_select_db(SAE_MYSQL_DB,$conn))
{
die("Select Database Failed:".mysql_error());
}
$Information=$_REQUEST["name"]; //通过$_REQUEST获得
$Information2=$_REQUEST["pw"];
}
//将传入的数据插到数据库中
$sql="insert into wechat(username,password) values (‘$Information‘,‘$Information2‘)";
$flag = mysql_query($sql,$conn);
if($flag){
$sql1 = "select * from wechat;";
$a = array();
$list = mysql_query($sql1,$conn);
while($s = mysql_fetch_assoc($list))
{
$a[] = $s;
}
//返回数组数据给android,返回的数据是JSON格式:[{"":""}]
print(json_encode($a));
}
mysql_close($conn);
?>