您的位置:首页 > 移动开发 > Android开发

Android中实现Web通信

2013-12-09 23:36 127 查看
我们都知道在学习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请求也会创建一个Socket
Socket 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;
@Override
protected 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.安卓设备所连接的网络必须和服务器端的网络在同一个网络中.否则通信会失败


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息