andriod之客户端连接服务端通信

主显示布局以及代码:

activity_main.xml:

(总结:1、这里犯了一个很大的错误:找了好久,真是血的教训啊,就是我写登陆事件的时候,本来是用一个工作线程去连接网络的,但是我没写new thread(),直接写代码了,但是andriod是不予许用主线程去连接网络的,所以就会报错,牢记啊。

2、关于更改ui的操作之类的,是不能再工作线程操作的,必须在主线程中操作,因为Android UI操作并不是线程安全的并且这些操作必须在UI线程(这里指的就是主线程)中执行,但是有一个UI控件列外:progressBar 是线程安全的。

3、progeressBar的更改值就写在工作线程了,然后可以在工作线程更改其值

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
  >
<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
  >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户名:" 
        android:textSize="20sp"/>
    <EditText 
        android:id="@+id/etUserName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
 </LinearLayout>
 <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
  >
     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码:"
         android:textSize="20sp" />
    <EditText 
        android:id="@+id/etPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>
<Button 
    android:id="@+id/btLogin"
    android:text="get方法登陆"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
<Button 
    android:id="@+id/btQuery"
    android:text="post方法查询"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>

java代码:

package com.example.urlconnetion;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;


import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.util.Log;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Toast;




public class MainActivity extends ActionBarActivity {
private EditText etUserName,etPassword;
private Handler handler;
private final static String PATH = "http://10.0.2.2:8080/Login_Servlet/Login_Servlet";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        setListener();
    }
private void setListener() {


// TODO Auto-generated method stub
findViewById(R.id.btLogin).setOnClickListener(new OnClickListener(){
//登陆监听事件


@Override
public void onClick(View view) {
// TODO Auto-generated method stub
new Thread(){


@Override
public void run() {
try{
String userName = etUserName.getText().toString();
if(TextUtils.isEmpty(userName)){
Message msg = new Message();
msg.obj = new String ("用户名必填");
handler.sendMessage(msg);
return;
}
String passWord = etPassword.getText().toString();
if(TextUtils.isEmpty(passWord)){
Message msg = new Message();
msg.obj = new String ("密码必填");
handler.sendMessage(msg);
return;
}
StringBuilder builder = new StringBuilder(PATH);
userName = URLEncoder.encode(userName, "utf-8");
builder.append("?name="+userName+"&password="+passWord);
URL url = new URL(builder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setDoInput(true);
//不设置也可以,默认值为true
conn.setRequestMethod("GET");//不设置也可以,默认为get方法,必须为大写
InputStream in = conn.getInputStream();
byte[] bs = new byte[1024];
String returnString = "";
while(in.read(bs)!=-1){
returnString += new String(bs);
}
//主线程处理ui显示 ---start
Message msg = new Message();
msg.obj = new String ("返回信息:"+returnString);
handler.sendMessage(msg);
//主线程处理ui显示 ---end
Log.i("main", "返回信息:"+returnString);
in.close();
}catch(Exception e){
e.printStackTrace();
String ee = e.getMessage();
Log.i("main", "错误信息:"+e.getMessage());
}
}

}.start();
}

});


findViewById(R.id.btQuery).setOnClickListener(new OnClickListener() {//查询事件监听

@Override
public void onClick(View view) {
new Thread(){
public void run(){
try{
String userName = etUserName.getText().toString();
if(TextUtils.isEmpty(userName)){
Message msg = new Message();
msg.obj = new String ("用户名必填");
handler.sendMessage(msg);
return;
}
String name = "name="+userName;
byte[] namebyte = name.getBytes("utf-8");
URL url = new URL(PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");//一定要设置,默认为get方法,一定要大写
conn.setDoOutput(true);//默认为false,所以一定要设置
OutputStream out = conn.getOutputStream();
out.write(namebyte);
out.flush();
InputStream in = conn.getInputStream();
byte[] bs = new byte[1024];
String returnString = "";
while(in.read(bs)!=-1){
returnString += new String(bs);
}
//主线程处理ui显示 ---start
Message msg = new Message();
msg.obj = new String ("返回信息:"+returnString);
handler.sendMessage(msg);
//主线程处理ui显示 ---end
Log.i("main", "返回信息:"+returnString);
in.close();
out.close();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
String ee = e.getMessage();
Log.i("main", "错误信息:"+e.getMessage());
e.printStackTrace();
}
}
}.start();
}
});


}
private void init() {
// TODO Auto-generated method stub
this.etUserName = (EditText) findViewById(R.id.etUserName);
this.etPassword = (EditText) findViewById(R.id.etPassword);
handler = new Handler(){


@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
String recivemsg = (String) msg.obj;
Toast.makeText(MainActivity.this,recivemsg, 20000).show();
}

};
}
}

菜单列表文件:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.urlconnetion"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
   
 <uses-permission android:name="android.permission.INTERNET"/>//设置上网的权限
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>

效果:


sevlet相关代码:

servlet的java代码

package com.litsoft.servlet;


import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.codehaus.jackson.map.ObjectMapper;


import com.litsoft.entity.User;


/**
 * Servlet implementation class Login_servlet
 */


public class Login_servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private List<User> users = new ArrayList<User>();
    /**
     * Default constructor. 
     */
    public Login_servlet() {
        // TODO Auto-generated constructor stub
    users.add(new User("张飞","1234567"));
    users.add(new User("李四","1234567"));
    users.add(new User("王菲","1234567"));
    users.add(new User("李菲菲","1234567"));
    System.out.println("初始化 servlet");
    }


/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("get方法");
String name = request.getParameter("name");
String password = request.getParameter("password");
if(name == null){
return;
}
name = new String(name.getBytes("iso8859-1"),"utf-8");
for (int i=0;i<users.size();i++){
User user = users.get(i);
if(name.equals(user.getName())&&password.equals(user.getPassword())){
String returnString = "{name:"+user.getName()+",password:"+user.getPassword()+"}";
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.print(returnString);
out.flush();
out.close();
// ObjectMapper om = new ObjectMapper();
// om.writeValue(response.getOutputStream(), user);
}
}


}


/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("post方法");
String name = request.getParameter("name");
if(name==null){
return;
}
name = new String(name.getBytes("iso8859-1"),"utf-8");
List<User> resultList = new ArrayList<User>();
for(int i=0;i<users.size();i++){
User user = users.get(i);
String userName = user.getName();
if(userName.indexOf(name)!=-1){
resultList.add(user);
}
}
String returnString = "[";
for (int i=0;i<resultList.size();i++){
User user = resultList.get(i);
returnString +="{name:"+user.getName()+",password:"+user.getPassword()+"}";
}
returnString +="]";
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.print(returnString);
out.flush();
out.close();
}


}

user类:

package com.litsoft.entity;


public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Login_Servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  <servlet-name>Login_Servlet</servlet-name>
  <servlet-class>com.litsoft.servlet.Login_servlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>Login_Servlet</servlet-name>
  <url-pattern>/Login_Servlet</url-pattern>
  </servlet-mapping>
</web-app>

------------------------------------------------用json工具版本----------------------------------------------

(总结:刚才在andriod客户端转换user时,总是报错,然后查找原因,原来是user没有写默认构造器,所以报错了,以后要加上默认构造器),相关的jar在我的资源里找

布局和上面一样:

andriod客户端java代码:

package com.example.urlconnetion;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;


import org.codehaus.jackson.map.ObjectMapper;


import com.litsoft.entity.User;


import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.util.Log;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Toast;




public class MainActivity extends ActionBarActivity {
private EditText etUserName,etPassword;
private Handler handler;
private final static String PATH = "http://10.0.2.2:8080/Login_Servlet/Login_Servlet";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        setListener();
    }
private void setListener() {


// TODO Auto-generated method stub
findViewById(R.id.btLogin).setOnClickListener(new OnClickListener(){
//登陆监听事件


@Override
public void onClick(View view) {
// TODO Auto-generated method stub
new Thread(){


@Override
public void run() {
try{
String userName = etUserName.getText().toString();
if(TextUtils.isEmpty(userName)){
Message msg = new Message();
msg.obj = new String ("用户名必填");
handler.sendMessage(msg);
return;
}
String passWord = etPassword.getText().toString();
if(TextUtils.isEmpty(passWord)){
Message msg = new Message();
msg.obj = new String ("密码必填");
handler.sendMessage(msg);
return;
}
StringBuilder builder = new StringBuilder(PATH);
userName = URLEncoder.encode(userName, "utf-8");
builder.append("?name="+userName+"&password="+passWord);
URL url = new URL(builder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setDoInput(true);//不设置也可以,默认值为true
conn.setRequestMethod("GET");//不设置也可以,默认为get方法,必须为大写
if(conn.getResponseCode()!=200){
return ;
}
ObjectMapper om=new ObjectMapper();
User user = om.readValue(conn.getInputStream(), User.class);
String returnString = user.toString();

//主线程处理ui显示 ---start
Message msg = new Message();
msg.obj = new String ("返回信息:"+returnString);
handler.sendMessage(msg);
//主线程处理ui显示 ---end
Log.i("main", "返回信息:"+returnString);
}catch(Exception e){
e.printStackTrace();
String ee = e.getMessage();
Log.i("main", "错误信息:"+e.getMessage());
}
}

}.start();
}

});


findViewById(R.id.btQuery).setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {//设置查询监听
new Thread(){
public void run(){
try{
String userName = etUserName.getText().toString();
if(TextUtils.isEmpty(userName)){
Message msg = new Message();
msg.obj = new String ("用户名必填");
handler.sendMessage(msg);
return;
}
String name = "name="+userName;
byte[] namebyte = name.getBytes("utf-8");
URL url = new URL(PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");//一定要设置,默认为get方法,一定要大写
conn.setDoOutput(true);//默认为false,所以一定要设置
OutputStream out = conn.getOutputStream();
out.write(namebyte);
out.flush();
if(conn.getResponseCode()!=200){
return ;
}
ObjectMapper om=new ObjectMapper();
List list = om.readValue(conn.getInputStream(),List.class);
String returnString = list.toString();

//主线程处理ui显示 ---start
Message msg = new Message();
msg.obj = new String ("返回信息:"+returnString);
handler.sendMessage(msg);
//主线程处理ui显示 ---end
Log.i("main", "返回信息:"+returnString);
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
String ee = e.getMessage();
Log.i("main", "错误信息:"+e.getMessage());
e.printStackTrace();
}
}
}.start();
}
});


}
private void init() {
// TODO Auto-generated method stub
this.etUserName = (EditText) findViewById(R.id.etUserName);
this.etPassword = (EditText) findViewById(R.id.etPassword);
handler = new Handler(){


@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
String recivemsg = (String) msg.obj;
Toast.makeText(MainActivity.this,recivemsg, 20000).show();
}

};
}
}

user类:

package com.litsoft.entity;


import java.io.Serializable;


public class User implements Serializable{
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}
public User() {
// TODO Auto-generated constructor stub
}
}

servlet代码:

package com.litsoft.servlet;


import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.codehaus.jackson.map.ObjectMapper;


import com.litsoft.entity.User;


/**
 * Servlet implementation class Login_servlet
 */


public class Login_servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private List<User> users = new ArrayList<User>();
    /**
     * Default constructor. 
     */
    public Login_servlet() {
        // TODO Auto-generated constructor stub
    users.add(new User("张飞","1234567"));
    users.add(new User("李四","1234567"));
    users.add(new User("王菲","1234567"));
    users.add(new User("李菲菲","1234567"));
    System.out.println("初始化 servlet");
    }


/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("get方法");
String name = request.getParameter("name");
String password = request.getParameter("password");
if(name == null){
return;
}
name = new String(name.getBytes("iso8859-1"),"utf-8");
for (int i=0;i<users.size();i++){
User user = users.get(i);
if(name.equals(user.getName())&&password.equals(user.getPassword())){
//这里用的是json工具,不用自己拼接成json了---start
ObjectMapper om = new ObjectMapper();
om.writeValue(response.getOutputStream(), user);
//这里用的是json工具,不用自己拼接成json了---end
break;
}
}


}


/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("post方法");
String name = request.getParameter("name");
if(name==null){
return;
}
name = new String(name.getBytes("iso8859-1"),"utf-8");
List<User> resultList = new ArrayList<User>();
for(int i=0;i<users.size();i++){
User user = users.get(i);
String userName = user.getName();
if(userName.indexOf(name)!=-1){
resultList.add(user);
}
}
//这里用的是json工具,不用自己拼接成json了---start
ObjectMapper om = new ObjectMapper();
om.writeValue(response.getOutputStream(),resultList);
//这里用的是json工具,不用自己拼接成json了---end
}


}

user对象:

package com.litsoft.entity;


import java.io.Serializable;


public class User implements Serializable{
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}

}

----------------------------------------------------以下是网上资料---------------------------------------------------------------------

1)让Android模拟器支持中文输入法

settings -> language & keyboard -> "选中"谷歌拼音输入法 

如下图:

Android模拟器切换中文输入法Android模拟器切换中文输入法

2、可以在上面拉下来,选择输入法,然后开始用:


对于ui线程的相关资料:

1、为什么说invalidate()不能直接在线程中调用?
答:
    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。例如:在非UI线程中调用invalidate会导致线程不安全,也就是说可能在非UI线程中刷新界面的时候,UI线程(或者其他非UI线程)也在刷新界面,这样就导致多个界面刷新的操作不能同步,导致线程不安全
2、它是怎么违背单线程的?
答:一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。由于只有UI线程更新界面所以说
Android是单线程模型。   一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,在非主线程(UI线程)外调invalidate()刷新界面出现异常,即是说用其他的线程更新UI,android中是不被允许的。
3、android ui为什么说不是线程安全的?
答:android UI 中提供invalidate()来更新界面,而invalidate()方法是线程不安全。
4、android ui操作为什么一定要在UI线程中执行?
答:UI主线程是更新UI界面的,更新了界面才能看到运行的效果。
     再者Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。


在 setProgress 的源码中,首先会判断当前线程是否为主UI线程,若是主UI线程则直接调用 doRefreshProgress 方法更新进度;若不是主UI线程则会先创建一个RefreshProgressRunnable 对象,然后调用 view 的 post(Runnable action) 方法,将 RefreshProgressRunnable 放到主UI线程的消息队列等待处理。所以更新进度的时候,在不在主线程调用setProgress 方法是没有影响的。同理,SeekBar、ProgressDialog 也是可以在子线程直接更新进度的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值