Android 之 多线程和Socket套接字的使用介绍

[size=medium][color=red][b] Android 网络编程[/b][/color][/size]

[size=small][color=olive][b]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 协议上的一种通信,在通信的两端各建立一个虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信)

注意:客户端访问服务器需要设置权限:[/b][/color][/size]

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


[size=small][color=red][b] 服务器端:[/b][/color][/size]
  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();
}
}
}


[size=small][color=red][b]
客户端:[/b][/color][/size]

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
}

}

}


[size=medium][color=red][b]详细请参考附件:实现多线程 多窗口的聊天记录:[/b][/color][/size]

[img]http://dl2.iteye.com/upload/attachment/0095/0517/bb03ad75-bedc-3b14-affc-bd6bd4ccb710.jpg[/img]

[img]http://dl2.iteye.com/upload/attachment/0095/0519/6f2c885c-8332-3cc5-9eb1-7ba1131d3c1f.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0095/0521/9fba0202-ee80-3a1c-8202-5d62e1d8e3ae.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0095/0523/335154bc-dc91-3793-8c09-490a2572d984.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值