Android中实现Web通信

来源:互联网 发布:linux系统怎么学 编辑:程序博客网 时间:2024/05/19 13:17

我们都知道在学习java时,我们可以使用TCP/IP协议来实现通信,而且实现的是可靠传输,其实TCP,IP是两个不同的协议,IP协议只是用于实现连接不进行数据传输.

而TCP协议则是一种传输协议,实现传输之前必须先实现连接,这两个协议是相互互补的,所以我们称之为TCP/IP协议.与之对应的是UDP协议,这是不可靠的传输,那么究竟什么是TCP/IP协议,什么是UDP协议,下面让我们来看看这两个协议的区别以及相互的优缺点.

TCP(传输控制协议):

1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;

2)面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。

3)TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。

UDP(用户数据报协议,User Data Protocol)

1)面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接发送,像短信,QQ),不能提供可靠性、流控、差错恢复功能。UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。

2) UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

总结:

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

好了区别也看了,那么下面就让我们看看具体的例子怎么实现的,java中实现web通信,相信做过javaweb的应该已经很清楚,那么在安卓中又是如何实现的呢?

其实在安卓中java的那些api仍然使用,比如Socket等:

我们先新建一个服务端,我们可以直接建立一个Java工程:

package serverpackage;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class SimpleServer {public static void main(String[] args) throws Exception{//创建一个ServerSocket对象用于接收客户端请求ServerSocket ss=new ServerSocket(30000);//循环的接收while(true){//服务器端每次接受到一个客户端的Socket请求也会创建一个SocketSocket s=ss.accept();OutputStream os=s.getOutputStream();os.write("您好,欢迎使用本系统".getBytes());//关闭输入输出流os.close();s.close();}}}

创建完服务端我们该如何去实现安卓项目来与之通信呢?

如下步骤:

第一步:xml文件如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent" >    <Button        android:id="@+id/btn_link"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/link"        android:textColor="#000000"        android:textSize="20sp" />    <TextView        android:layout_marginTop="30dp"        android:id="@+id/tv_show"        android:textSize="20sp"        android:textColor="#0000ff"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></LinearLayout>

当点击按钮时将服务器端的数据发送到客户端.

代码如下所示:

package com.brucecheng.client;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.Socket;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {//寻找控件TextView tv_show;Button btn_link;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//实例化控件tv_show=(TextView) findViewById(R.id.tv_show);btn_link=(Button) findViewById(R.id.btn_link);//设置监听事件btn_link.setOnClickListener(new OnClickListener() {public void onClick(View v) {//创建Socket对象try {Socket s=new Socket("192.168.1.236", 30000);//将Socket对应输入流变为包装流BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//进行普通的IO操作String line=br.readLine();tv_show.setText("来自服务器的消息:"+line);br.close();s.close();} catch (Exception e) {e.printStackTrace();}}});}}

最后运行结果如下所示:

从运行结果我们可以看到,通信已经成功:

注意:再次我们要注意以下几点:

1.因为这是web通信我们需要联网,所以我们也要注册权限,即:<uses-permission android:name="android.permission.INTERNET"/>.

2.安卓设备所连接的网络必须和服务器端的网络在同一个网络中.否则通信会失败



0 0