android 局域网邻居,Android访问局域网内的pc服务器

从阎宝
2023-12-01

博客一血,就献给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”时,返回“登录成功”,否则返回”登录失败“

移动端

清单文件

android:allowBackup="true"

android:icon="@drawable/logo"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

一定要给网络权限!!网络权限!!网络!!网!

layout代码:<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPersonName"

android:text="Name"

android:ems="10"

android:id="@+id/username" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPassword"

android:ems="10"

android:id="@+id/psw" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="提交"

android:id="@+id/btn"

android:layout_gravity="right" />

最简单的布局,不多说

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的防火墙,在进行测试。

 类似资料: