写点什么

巧用 Android 网络通信技术,在网络上直接传输对象,android 设计模式总结

用户头像
Android架构
关注
发布于: 刚刚

<RelativeLayout 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:background="#000"tools:context=".MainActivity" >


<Buttonandroid:id="@+id/send"


android:layout_width="fill_parent"android:lay


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


out_height="wrap_content"android:text="发送"/>


</RelativeLayout>


这个布局里面就是包含了一个按钮,点击这个按钮就去发出网络请求。


接下来打开或新建 MainActivity 作为程序的主 Activity,其中加入如下代码:


public class MainActivity extends Activity implements OnClickListener {


private Button send;


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);send = (Button) findViewById(R.id.send);send.setOnClickListener(this);}


@Overridepublic void onClick(View v) {Book book = new Book();book.setBookName("Android 高级编程");book.setAuthor("Reto Meier");book.setPages(398);book.setPrice(59.00);URL url = null;ObjectOutputStream oos = null;try {url = new URL("http://192.168.1.103:8080/ServerTest/servlet/TestServlet");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setDoOutput(true);connection.setConnectTimeout(10000);connection.setReadTimeout(10000);connection.setRequestMethod("POST");oos = new ObjectOutputStream(connection.getOutputStream());oos.writeObject(book);InputStreamReader read = new InputStreamReader(connection.getInputStream());BufferedReader br = new BufferedReader(read);String line = "";while ((line = br.readLine()) != null) {Log.d("TAG", "line is " + line);}br.close();connection.disconnect();} catch (Exception e) {e.printStackTrace();} finally {


}}


}


我们可以看到,在 onClick 方法中处理了按扭的点击事件。这里首先 new 出了一个 Book 对象作为待传输数据,接着 new 出了一个 URL 对象,指明了服务器端的接口地址,然后对 HttpURLConnection 的一些可选参数进行配置。接着通过调用 ObjectOutputStream 的 writeObject 方法,将 Book 对象发送到服务器端,然后等服务器端返回数据,最后关闭流和连接。


注意由于我们使用了网络功能,因此需要在 AndroidManifest.xml 中加入如下权限:


<uses-permission android:name="android.permission.INTERNET" />


好了,目前 Android 端的代码已经开发完成,我们现在开始来编写服务器端代码。


新建一个名为 ServerTest 的 Web Project,要做的第一件事就在 Web Project 下建立一个和 Android 端一样的 Book 类。这里有个非常重要的点大家一定要注意,服务器端的 Book 类和 Android 端的 Book 类,包名和类名都必须相同,否则会出现类型转换异常。这里由于两个 Book 类的内容是完全一样的,我就不再重复贴出。


然后新建一个 Java Servlet 作为网络访问接口,我们重写它的 doPost 方法,具体代码如下:


public class TestServlet extends HttpServlet {


public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ObjectInputStream ois = null;try {ois = new ObjectInputStream(request.getInputStream());Book book = (Book) ois.readObject();System.out.println("书名是: " + book.getBookName());System.out.println("作者是: " + book.getAuthor());System.out.println("价格是: " + book.getPrice());System.out.println("页数是: " + book.getPages());PrintWriter out = response.getWriter();out.print("success");out.flush();out.close();} catch (Exception e) {e.printStackTrace();} finally {ois.close();}}


}

可以看到,我们首先通过调用 HttpServletRequest 的 getInputStream 方法获取到输入流,然后将这个输入流组装成 ObjectInputStream 对象。接下来就很简单了,直接调用 ObjectInputStream 的 readObject 方法,将网络上传输过来的 Book 对象获取到,然后打印出 Book 中携带的数据,最后向客户端返回 success。


现在我们来运行一下程序,首先将 ServerTest 这个项目布置到服务器上,并开启服务器待命。接着在手机上打开 ClientTest 这个应用程序,如下图所示:



点击发送发出网络请求,可以看到服务器端打印结果如下:



而 Android 端打印结果如下:



用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
巧用Android网络通信技术,在网络上直接传输对象,android设计模式总结