Android学习11Android上的网络编程

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方法得到的文本并不知道属于哪个元素下的,所以操作有些局限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值