您的位置:首页 > 理论基础 > 计算机网络

Android学习11Android上的网络编程

2011-05-11 11:11 323 查看
1.基于Socket套接字的网络编程

说到网络开发,首先想到的一定是Socket编程,在游戏开发中,应用最多的网络编程技术也是Socket,下面通过一个例子说明如何在Android平台下完成基于Socket的网络应用开发

首先是服务端的开发,新建一个普通的Java项目,在src目录下新建一个类AndroirdServer其代码如下:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class AndroidServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;

try {
serverSocket = new ServerSocket(8888); //监听到8888端口
System.out.println("以及监听到8888端口");
} catch (Exception e) {
e.printStackTrace();
}

while(true){
try {
socket = serverSocket.accept(); //等待客户端连接
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());//得到输入输出流
String msg = dataInputStream.readUTF(); //读取一个字符串
System.out.println("ip:"+ socket.getInetAddress()); //打印客户端IP
System.out.println("msg" + msg); //打印客户端发来的消息
System.out.println("*********************");
dataOutputStream.writeUTF("Hello Client!"); //像客户端发送消息
} catch (Exception e) {
e.printStackTrace();
}
finally{ //用finally语句块确保动作执行
try{
if(dataOutputStream != null){
dataOutputStream.close(); //关闭输出流
}
if(dataInputStream != null){
dataInputStream.close(); //关闭输入流
}
if(socket != null){
socket.close(); //关闭Socket连接
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}

在AndroidMainfest.xml加一句

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

布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:id="@+id/editText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text = "Hello Server!"
/>

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送信息到服务器"
/>

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="服务器发来的消息:"
/>
</LinearLayout>

Activity类代码如下:

package karant.zhan;

import java.io.DataInputStream;
import java.io.DataOutputStream;
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.EditText;
import android.widget.TextView;

public class AndroidSocket extends Activity implements OnClickListener{

Button button; //button对象引用
EditText editText;
TextView textView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

button = (Button)findViewById(R.id.button);
editText =(EditText)findViewById(R.id.editText);
textView = (TextView)findViewById(R.id.textView);
button.setOnClickListener(this); //添加监听
}

@Override
public void onClick(View v) {

Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
if(v == button)
{
try{
socket = new Socket("113.57.79.33" ,8888); //连接服务器
dataOutputStream = new DataOutputStream(socket.getOutputStream()); //得到输出流
dataInputStream = new DataInputStream(socket.getInputStream()); //得到输入流
dataOutputStream.writeUTF(editText.getText().toString()); //向服务器发送消息
textView.setText("服务器发来的消息" + dataInputStream.readUTF()); //接收服务器发来的消息

}catch (Exception e) {
e.printStackTrace();

}finally{
try {
if(dataOutputStream != null){
dataOutputStream.close(); //关闭输出流
}
if(dataInputStream != null){
dataInputStream.close(); //关闭输入流
}
if(socket != null){
socket.close(); //关闭Socket连接
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}

}
}

2 基于Http协议的网络编程

2.1 通过URL获取网络资源

HTTP协议最简单的应用就是通过URL获取网络资源了,下面的例子是在Android平台下通过URL获取谷歌主页的源代码并显示在滚动的View中

新建项目,为该项目添加网络权限,打开AndroidManifest.xml文件,在</manifest>标记之前加上<uses-permission android:name="android.permission.INTERNET"/>。

Activity类代码如下:

package karant.zhan;

import java.io.BufferedInputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;
import org.apache.http.util.EncodingUtils;

import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ScrollView;
import android.widget.TextView;

public class HttpTest extends Activity {

TextView textView = null;
ScrollView scrollView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
scrollView = new ScrollView(this);
URLConnection urlConnection = null;
BufferedInputStream bufferedInputStream = null;
ByteArrayBuffer byteArrayBuffer = null;

try {
URL myURL = new URL("http://www.google.cn/"); //初始化URL
urlConnection = myURL.openConnection(); //打开 连接
bufferedInputStream = new BufferedInputStream(urlConnection.getInputStream()); //通过连接得到输入流
int current = 0;
byteArrayBuffer = new ByteArrayBuffer(1000);
while((current = bufferedInputStream.read()) != -1){
byteArrayBuffer.append((char)current); //将收到的信息添加到ByteArrayBuffer中

}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(bufferedInputStream != null){
bufferedInputStream.close(); //关闭输入流
bufferedInputStream = null;
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
textView.setText(EncodingUtils.getString(byteArrayBuffer.toByteArray(), "UTF-8")); //设置textView的内容
scrollView.addView(textView); //将testView添加到scrollView中
this.setContentView(scrollView); //设置当前显示的用户界面为scrollView

}
}

2.2在Android中解析XML

XML是一种通用的数据交换格式,他的平台无关性,语言无关性,系统无关性为数据集成与交换带来了很大的方便,XML文件解析对Android来说必不可少。

Android中解析XML的方式有两种,一种叫DOM,另一种叫SAX,下面介绍这两种方式

DOM方式:DOM是一种基于XML文档树结构的解析,解析之前通常需要加载整个XML文档和构造结构,之后的解析就是在代码Java代码中通过DOM接口操作之前构造的树结构。DOM方式解析XML的优点是整个XML的树结构存在于内存中,可以很方便的操作,而且可以很轻松地删除XML树结构。但是DOM方式每次须将整个XML文档掉入内存,而往往只是对期中很小一部分进行操作,这就浪费了很多资源。

SAX方式。SAX是一种基于事件流的解析方式。解析之前不需要加载整个XML文档,而是当解析器遇到某些标记触发一些事件,开发人员编写响应这些事件的代码来做相应的处理。所以SAX方式解析XML比较迅速,而且节约资源。但是因为i在解析过程中并没有加载XML,所有SAX方式解析的数据不持久,如果没有及时保存的话,很容易丢失。又因为SAX方法得到的文本并不知道属于哪个元素下的,所以操作有些局限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: