博客一血,就献给Android和Javaweb了。希望能帮到和我一样是初学者的小伙伴,同时也请大虾指点。
如题,相信学了Java的同志们,大多都会在这两条路上出选择。然而两者又是相辅相成,不分你我。
笔者先学的Javaweb,最简单的用Tomcat,通过路由构建的局域网,就能通过手机浏览器访问,实现简单的
局域网间访问。意外学习了半个月的Android,便想通过App来完成,同时实验室还有学硬件的小伙伴,一起
捣鼓了个通过蓝牙模块实时测温湿度的小东西,若将测得的数据连入后台,就能开始做小规模的数据分析
了。
下面进入正题:
Web端:Interlij Idea 2016.3.3
服务器 :apache-tomcat-7.0.42
Android:Android Studio 2.1.1
首先创建服务器端:
代码如下:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;
public class loginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{ String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+":"+password); response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String msg = null; if(username != null && username.equals("xiaoming") && password != null && password.equals("123")){ msg="登录成功"; } else { msg = "登录失败"; } out.print(msg); out.flush(); out.close(); } }
复写doGet()方法,当用户名为"xiaoming"密码为“123”时,返回“登录成功”,否则返回”登录失败“
移动端
清单文件
一定要给网络权限!!网络权限!!网络!!网!
layout代码:
最简单的布局,不多说
Activity代码: import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;
import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;
public class loginActivity extends Activity{
Button btn;
TextView uname;
TextView psw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
psw= (TextView) findViewById(R.id.psw);
uname= (TextView) findViewById(R.id.username);
btn= (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v.getId()==R.id.btn){
String username=uname.getText().toString();
String pass= psw.getText().toString();
String urlStr="http://192.168.6.2/loginServlet?"+
"username="+username+"&password="+pass;
Log.d("lll","......."+urlStr);
new Async().execute(urlStr);
}
}
});
}
class Async extends AsyncTask
{
@Override
//后台子线程
protected String doInBackground(String... params) {
String result="";
String path=params[0];
try {
URL url=new URL(path);
HttpURLConnection conn=
(HttpURLConnection) url.openConnection();
//文件的读写
InputStream is=conn.getInputStream();
byte[] b=new byte[2048];
int len =0;
while ((len=is.read(b))!=-1)
{
Log.d("lll", len+"");
result=new String (b);
Log.d("lll","........"+result);
Thread.sleep(200);//进程休眠,便于观看效果
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//实时更新的 主线程
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
}
//前台主线程
protected void onPostExecute(String result) {
showDialog(result);
super.onPostExecute(result);
}
}
private void showDialog(String msg){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(msg).setCancelable(false).setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
这是问题的关键了。 最先开始直接在button的点击事件里添加login连接Internet的方法。 但是这么会报android.os.NetworkOnMainThreadException。 原因是因为在Android4.0之后规定,Internet连接操作必须放在子进程里 所以我们就得借助一些对象啦。 笔者用的是AsyncTask这个类。
AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。AsyncTask类的声明如下:
public abstract class AsyncTask
我们可以看到,AsyncTask是一个泛型类,它的三个类型参数的含义如下:
Params:doInBackground方法的参数类型; Progress:AsyncTask所执行的后台任务的进度类型; Result:后台任务的返回结果类型。 我们再来看一下AsyncTask类主要为我们提供了哪些方法:
onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作 doInBackground(Params... params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法) onProgressUpdate(Progress... values) //由publishProgress内部调用,表示任务进度更新 onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果 onCancelled() //此方法会在后台任务被取消时被调用
以上方法中,除了doInBackground方法由AsyncTask内部线程池执行外,其余方法均在主线程中执行。
接下来,只要把URL的地址和端口改成PC在局域网中的IP和Tomcat的端口就行了。
如果要是还是不可以访问的话,建议关闭PC的防火墙,在进行测试。