Android 网络编程

1、网络通信协议及接口

网络通信协议:
就是对计算机之间通信的信息格式,能被收/发双方接受的传递信息的内容的一组定义。即,连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言。

网络通信接口:
为了使两个结点能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换,接口包括两个部分:
硬件装置:实现结点之间的信息传送;
软件装置:规定双方进行通信的约定协议;

2、通信协议的分层思想:

为什么要分层?
解:由于结点之间联系复杂,在制定协议时,把复杂成分分解成一些简单成分,再将它们复合起来,最常用的复合方式是层次方式,即同层间可以通信,上一层可以调用下一层,而与再下一层没有关系,各层互不影响,利于系统的开发和扩展;

通信协议的分层规定:
应用程序作为做最高层,把物理通信线路作为最底层,将期间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。

3、参考模型:

OSI 参考模型 TCP/IP参考模型

-------------------- --------------------
| 应用层 | | |
-------------------- | |
| 表示层 | | 应用层 |
-------------------- | |
| 会话层 | | |
-------------------- --------------------
| 传输层 | | 传输层 |
-------------------- --------------------
| 网络层 | | 网络层 |
-------------------- --------------------
| 数据链路层 | | |
-------------------- | 物理+数据链路层 |
| 物理层 | | |
-------------------- --------------------

4、IP 协议:
IP 协议就是为计算机网络相互连接进行通信设计的协议。在因特网中,它能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通;




5、TCP协议 和 UDP 协议:

TCP协议:专门用来设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接的是字节流而非报文流。

特点:面向连接 | 可靠 | 效率低

UDP协议:向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接。是一种不可靠的连接。

特点:面向无连接 | 不可靠 | 效率高


6、TCP/UDP 区别:

TCP 协议进行通讯的两个应用程序有主次之分,一个称为服务器程序,一个称为客户端程序,两者功能和编写方法不大一样;

UDP 通信的两个程序是平等的,么有主次之分,2个程序代码可以是一样的;


7、C/S 模式(客户端/服务器模式):优点,

服务器和客户端分摊工作;
服务器可以同时为数千台客户端服务;
多个客户端可以同时访问服务器;

提示:代表本地客户端地址:10.0.2.2

8、------------------------------ Socket ------------------------

1、Socket 的介绍:(IT 中称为 "套接字")

Socket: 网络通信的接口,基于不同的协议,有各种不同的Socket , 比如有基于TCP 协

议的Socket 和基于UDP 协议的Socket 以及基于蓝牙协议的Socket ,Android 中使用的是

Java 的Socket 模型;

Socket 用于描述IP地址和端口,是一种通信链的句柄,这是一个比较抽象的概念;


2、端口简单介绍:

每一个端口都可以有一个应用程序来进行通讯使用;端口是计算机和外界通讯的接口,这些接口都是逻辑接口;
取值范围:0~~~256*256-1
提示:1024 以下都是操作系统保留端口,为了避免冲突,请使用 大于1024 的端口号;
例如:Http 协议使用端口: 80
Ftp 协议使用端口:21

3、Socket 的作用:

应用程序可以通过 “ 套接字 ” 向网络发送请求或者应答网络的请求,这时候就把Socket 分成了两部分,一部分是服务器端的Socket 。 一部分是客户端的Socket ,这个Socket主要用来向网络发送数据。

注意:发送数据的时候用的是什么协议,接收的时候也要用相同的协议;发送的时候指定接收端的IP地址和端口号就可以了,究竟数据包或数据是如何发送的,框架已经帮我们封装好了,我们不用去关心的;

4、下面请看代码,演示的时 客户端向服务器发送请求,并接收服务器端返回的数据;
(Socket 是TCP/IP 协议上的一种通信,在通信的两端各建立一个虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信)

注意:客户端访问服务器需要设置权限:


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


服务器端:
  import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/** * 服务器端 *  * @author Administrator *  */public class MyServer {    // 程序入口    public static void main(String args[]) {        try {            // 建立一个ServletSocket ,监听对应的端口,用于监听客户端的连接请求            ServerSocket serverSocket = new ServerSocket(40000);            while (true) { // 循环不断接收客户端的请求                System.out.println("等待客户端请求....");                Socket socket = serverSocket.accept(); // 等待接收                System.out.println("收到请求,服务器运行...");                // 返回数据                OutputStream os = socket.getOutputStream();                String msg = "服务器大国的钦差到了...";                os.write(msg.getBytes("utf-8"));                /* ---------- 不能在此处读取数据,否则会造成数据堵塞,无法运行                 理由:使用传统的BufferedReader  的readLine 方法读取数据时,在该方法成功返回之前线程被阻塞,程序无法继续执行。                ------------- */                // 接收客户端数据,并返回数据                // InputStream is = socket.getInputStream();                // BufferedReader br = new BufferedReader(new                // InputStreamReader(is,"UTF-8")); // 字符流处理                // System.out.println("客户端发送数据为:"+br.readLine());                // is.close();                /* ---------------------- */                os.close();                socket.close();            }        } catch (Exception e) {            e.printStackTrace();        }    }}



客户端:


package com.sun.clientsocket;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;public class MainActivity extends Activity {    // 程序入口    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        try {                        // 获取Socket 套接字,指定发送地址以及端口,发送请求            // 提示:代表本地客户端地址:10.0.2.2            Socket socket = new Socket("10.0.2.2", 40000);                        // 发送请求数据            OutputStream os = socket.getOutputStream();            os.write("参加服务器大王,我是客户端使者,请求响应".getBytes("utf-8"));                        // 获取服务器返回的数据            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));            Log.i("msg", "服务器数据:"+br.readLine());                        os.close();            br.close();            socket.close();                } catch (Exception e) {            // TODO: handle exception        }            }    }


详细请参考附件:实现多线程 多窗口的聊天记录:












更多相关文章

  1. Android(安卓)Spinner与适配器模式详解及实例代码
  2. 9.1、Android中得到新打开Activity 关闭后返回的数据
  3. Android(安卓)IPC机制之 Android的各种IPC方式
  4. camp
  5. Android(安卓)Jackson、Gson、FastJson解析框架对比
  6. MVC在安卓应用,ANR,Force Close,Contentprovider实现数据共享
  7. ARM NEON 指令
  8. android javaScript数据传递
  9. android之ContentProvider详解

随机推荐

  1. 操作内存卡的常用代码
  2. Android(安卓)Studio使用AIDL时无法找到
  3. Android(安卓)linux PWM驱动(s5pv210)
  4. Android之Dialog集合
  5. Android(安卓)ListView addScrapView Arr
  6. android 照相以及关于自动生成的图片分辨
  7. android volley 发送 POST 请求
  8. 选择图文表
  9. ffmepg x264 fdk-aac android ndk全CPU编
  10. Android(安卓)屏幕截图 代码