您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > android-网络编程
Android-网络编程本章目标•TCP/IP协议•IP地址•使用ServerSocket建立服务器•使用Socket进行网络编程网络通信协议及接口•网络通信协议就是对计算机之间通信的信息格式、能被收/发双方接受的传送信息内容的一组定义。即连接不同操作系统和不同硬件体系结构的互联网络提供通信支持,是一种网络通用语言。•网络通信接口为了使两个结点能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:硬件装置:实现结点之间的信息传送软件装置:规定双方进行通信的约定协议通信协议的分层思想•为什么要分层由于结点之间联系复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信,上一层可以调用下一层,而与再下一层没有关系。各层互不影响,利于系统的开发和扩展。•通信协议的分层规定把用户应用程序作为最高层,把物理通信线路作为最底层,将期间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。参考模型数据封装数据拆封IP协议•IP协议就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。TCP协议和UDP协议•TCP协议TCP是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议,TCP连接的是字节流而非报文流。•UDP协议:UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接。是一种不可靠的连接。TCP/UDP区别•编程时区别–利用TCP协议进行通信的两个应用程序是有主次之分,一个称为服务器程序,另外一个称为为客户机程序,两者功能和编写方法大不一样。–利用UDP通信的两个程序是平等的,没有主次之分,2个程序代码可以是完全一样的。客户端/服务器模式•又称为智能服务器/智能客户端体系结构•服务器和客户端共同承担计算–客户端a)向另一台计算机请求服务的计算机–服务器a)处理客户端请求的计算机优点•服务器和客户端分摊工作•服务器可以同时为数千台客户端服务•多个客户端可以同时访问服务器什么是Socket•它实际上是网络通信的一种接口,基于不同的协议,有各种不同的Socket,比如有基于TCP协议的Socket和基于UDP协议的Socket以及基于蓝牙协议的Socket,Android中使用的是Java的Socket模型。•Socket在计算机行业通常称为”套接字“,用于描述IP地址和端口,是一个通信链的句柄。这是一个比较抽象的概念。计算机是拥有端口的,每一个端口都可以有一个应用程序来进行通讯的使用,比如:80端口是HTTP协议所使用的端口,21端口是FTP协议所使用的端口,端口是计算机和外界通讯的接口,这些接口都是逻辑的接口,端口号取值的范围是零到256乘以256减1,1024以下的端口都是操作系统使用的保留端口,以上的端口我们可以自由的来使用,不要和其他应用程序的端口冲突。•应用程序可以通过“套接字”向网络发送请求或者应答网络的请求,这时候就把Socket分成了两部分,一部分是服务器端的Socket,这个Socket主要用来接收来自网络的请求,它一直监听在某一个端口上。一部分是客户端的Socket,这个Socket主要用来向网络发送数据。Socket通讯模型UDP协议和TCP协议•UDP协议和TCP协议是互联网使用最广的两种协议,都是基于IP的协议。第一个区别是UDP协议是一个不太靠谱的协议,UDP协议把数据都打成数据包,数据包上自带通讯地址,也就是说我要把这个数据包发送到网络上的哪一个地址,通过网络把这个数据包发送出去,至于这个数据包是否发送到目的地,是否服务器端接收到了这个数据包,这个协议并不保证,就像中国的邮政,你是把信寄出去了,但是邮政系统不保证对方能收到你寄送的信。TCP发送数据的时候要求接收方接收到数据之后给一个回应,也就是你是否收到了,TCP可靠一些,当我们发送一些比较重要的数据的时候一般都使用TCP协议。另外一个区别是UDP协议发送的一个数据包它的容量是有限的,而TCP协议则没有这样一个限制。并不是说UDP协议一定就不如TCP协议,在不同的领域有不同的使用,UDP协议好处是速度相对快些。TCP协议相对慢些。Socket通讯流程•应用程序通过“套接字”也就是Socket可以选择这两种协议当中的一种,你可以选择用UDP发送数据,也可以选择用TCP发送数据,数据发送出去通过“通信信道”也就是IP的基础网络,来到服务器端(接收端),就可以接收到数据了。发送数据的时候用UDP协议,接收的时候也要用UDP协议,发送数据的时候用TCP协议,接收的时候也要用TCP协议,在发送的时候指定接收端的IP地址和端口号就可以了,究竟数据包或数据是如何发送的,框架已经帮我们封装好了,我们不去关心它了。Socket与ServerSocket•Socket是TCP/IP协议上的一种通信,在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。•ClientA发信息给ClientB,A的信息首先发送信息到服务器Server,Server接受到信息后再把A的信息广播发送给所有的Clients.•首先我们要在服务器建立一个ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。•Socketaccept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的SocketSocket与ServerSocketServer示例://创建一个ServerSocket,用于监听客户端Socket的连接请求ServerSocketss=newServerSocket(30000);//采用循环不断接受来自客户端的请求while(true){//每当接受到客户端Socket的请求,服务器端也对应产生一个SocketSockets=ss.accept();//下面就可以使用Socket进行通信了...}客户端通常可使用Socket的构造器来连接到指定服务器Client示例://创建连接到服务器、30000端口的SocketSockets=newSocket(192.168.2.214,30000);//下面就可以使用Socket进行通信了...这样Server和Client就可以进行一个简单的通信了Socket通信模型基于TCP协议的Socket使用ServerSocket创建TCP服务器端•服务器端编程步骤:1、创建服务器端套接字并绑定到一个端口上(0-1023是系统预留的,最好大于1024)2、套接字设置监听模式等待连接请求3、接受连接请求后进行通信4、返回,等待赢一个连接请求使用ServerSocket创建TCP服务器端•ServerSocket类的对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。ServerSocket包含一个监听来自客户端连接请求的方法。•Socketaccept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket,否则该方法将一直处于等待状态,线程也被阻塞。通常情况下,服务器不应该只接收一个客户端请求,而应该不断地接收来自客户端的所有请求。•当ServerSocket使用完毕后,应使用ServerSocket的close()方法来关闭该ServerSocket。•为了创建ServerSocket对象,ServerSocket类提供以下及格构造方法:–ServerSocket(intport):用指定的端口port来创建一个ServerSocket,该端口应该是一个有效的端口整数值0~65535.使用该构造方法创建的ServerSocket没有指定Ip地址,则该ServerSocket将会绑定到本机默认的Ip地址。通常端口号推荐使用1024以上的端口,以避免与其他应用程序的通用端口冲突。–ServerSocket(intport,intbacklog):增加一个用来改变连接队列长度的参数。–ServerSocket(intport,intbacklog,InetAddressaddr):在机器存在多个Ip地址的情况下,允许通过addr这个参数来指定将ServerSocket绑定到指定的Ip地址。由于手机无线上网的Ip地址通常是由移动运营公司动态分配的,一般不会有自己固定的Ip地址,因此很少在手机上运行服务器端,服务器端通常运行在有固定Ip的服务器上。使用ServerSocket创建TCP服务器端使用Socket进行通信•客户端编程步骤:1、创建客户端套接字(指定服务器端IP地址与端口号)2、连接(Android创建Socket时会自动连接)3、与服务器端进行通信4、关闭套接字使用Socket进行通信•Socket类常用的构造方法:用服务器端的IP地址对象和端口号建立SocketpublicSocket(InetAddressaddress,intport):用服务器端的机器名和端口号建立SocketpublicSocket(Stringhost,intport)•例如://创建连接到本机、端口为8899的SocketSockets=newSocket(“192.168.1.139”,8899);//下面就可以使用Socket进行通信了。。。。。。。。。。。。。。。说明:当程序执行上面代码时,该代码将会连接到指定服务器,让服务器的ServerSocket的accept()方法向下执行,于是服务器端和客户端就产生一对互相连接的Socket。•当客户端、服务器端产生了对应的Socket之后,就通过Socket进行通信。Socket提供如下两个方法来获取输入流和输出流。取得Socket对象的输入流publicInputStreamgetInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。取得Socket对象的输出流publicOutputStreamgetOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据。•关闭socketpublicvoidclose()throwsIOException使用Socket进行通信案例•服务器端:publicclassSimpleServer{publicstaticvoidmain(String[]args)throwsIOException{System.out.println(Howareyou...);//创建一个ServerSocket,用于监听客户端Socket的连接请求ServerSocketss=newServerSocket(20000);//采用循环不断接受来自客户端的请求while(true){//每当接受到客户端Socket的请求,服务器端也对应产生一个SocketSockets=ss.accept();OutputStreamos=s.getOutputStream();os.write(Howareyou!\n.getBytes(utf-8));//关闭输出流,关闭Socketos.close();s.close();}}}案例•客户端:publicclassSimpleClientextendsActivity{EditTextshow;publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main)
本文标题:android-网络编程
链接地址:https://www.777doc.com/doc-4765364 .html