总缺12 13讲第11 11网络编程_第1页
总缺12 13讲第11 11网络编程_第2页
总缺12 13讲第11 11网络编程_第3页
总缺12 13讲第11 11网络编程_第4页
总缺12 13讲第11 11网络编程_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章Android网络编程TCP/IP基础HTTP编程调用Web服务补充:socket编程11.1

TCP/IP基础TCP:Transmission

Control

Protocol

传输控制协议IP:Internet

Protocol

因特网互联协议TCP/IP协议定义了电子设备如何连入Internet,以及数据如何在它们之间进行传输的标准。TCP/IP协议是Internet最基本的协议,也是Internet的基础。TCP/IP协议不只是TCP和IP这两个协议,而是指整个TCP/IP协议族TCP/IP网络层次结构这里的英文缩写都是TCP/IP协议族的一员Socket编程和HTTP编程Socket编程HTTP编程(物理层)Socket概念网络上的两个应用程序之间的通信是分层进行的,socket是应用程序进行网络通信的接口。Socket=主机地址+端口号关于端口号如果要发起网络连接,不仅需要知道远程机器的地址或名字。而且,还需要一个端口号。客户端和服务器必须事先约定所使 用的端口,如果系统两部分所使用的端口不一致,那就不能进 行通信。 TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535。实际上,小于1024的端口号保留给预定义的服务。Socket=主机地址+端口号HTTP概念HTTP:HyperText

Transfer

Protocol

超文本传输协议HTTP协议是互联网上应用最多、最为广泛的一种网络协议。HTTP是一种是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。HTTP通信—HttpHTTP通信—HttpHttp采用请求/响应模型客户端向服务器发送请求请求内容包含:请求的方法、URL、协议版本、请求修饰符、客 户信息和内容的消息结构服务器端以一个状态行作为响应响应的内容包括消息协议的版本、成功或者错误编码、服务器信 息、实体元信息以及可能的实体内容最显著的特点客户端发送的每次请求都需要服务器回送响应请求结束后会主动释放连接8HTTP通信—Http请求格式http请求格式[":"port][abs_path]http使用http作为通讯协议以定位网络资源host合法的Internet主机域名或者IP地址端口指定访问的主机端口号默认为80访问地址指定访问的主机资源URI9HTTP通信—Http的请求方法http的请求方法GET请求获取Request-URI

所标识的资源;POST在Request-URI

所标识的资源后附加新的数据;HEAD请求获取由Request-URI

所标识的资源的响应消息报头PUT请求服务器存储一个资源,并用Request-URI

作为其标识DELETE请求服务器删除Request-URI

所标识的资源;TRACE请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT保留将来使用OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求10HTTP通信—Http协议请求方法应用举例:–

GET方法–

POST方法

GET

Host:

Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,

image/webp,*/*;q=0.8

POST

/inventory-check.cgi

HTTP/1.1

Host:

Content-Type:

text/plain

Content-length:

18

item=bandsaw

2647HTTP通信—Http响应HTTP响应也是由三个部分组成:状态行、消息报头、响应正文,一并发给客户端,状态行中包括状态码:1xx:指示信息--表示请求已接收,继续处理2xx:成功--表示请求已被成功接收、理解、接受3xx:重定向--要完成请求必须进行更进一步的操作4xx:客户端错误--请求有语法错误或请求无法实现5xx:服务器端错误--服务器未能实现合法的请求HTTP通信—Http常见状态码描述常见状态代码、状态描述、说明:200

OK//客户端请求成功400

Bad

Request//客户端请求有语法错误,不能被服务器所理解401Unauthorized//请求,这个状态代码必须和WWW-Authenticate报//头域一起使用403Forbidden//服务器收到请求,但是拒绝提供服务404

Not

Found//请求资源不存在,eg:输入了错误的URL500

Internal

Server

Error//服务器发生不可预期的错误503ServerUnavailable//服务器当前不能处理客户端的请求,一段时间后,//可能恢复正常eg:HTTP/1.1

200

OK

(CRLF)HTTP通信—Http响应应用举例:GET响应

HTTP/1.1

200

OK

Server:Apache

Tomcat/5.0.12

Date:Mon,6Oct2003

13:23:42

GMT

Content-Length:112

<html><head>

<title>HTTP响应示例<title>

</head>

<body>

Hello

HTTP!

</body>

</html>HTTP的POST和GET两种命令模式POST是被设计用来向上放东西的,而GET是被设计用来从服务器取东西的,GET也能够向服务器传送较少的数据。GET的数据是在HTTP

的头部传送的,而Post的数据则是在HTTP请求的内容里传送。POST传输数据时,不需要在URL中显示出来,而GET方法要在URL中显示。GET方法由于受到URL长度的限制,只能传递大约1024字节;

POST传输的数据量大,可以达到2M。HTTP

GET示例<html><body><form

action="login.jsp"

method="get"

>用户名:<input

type="text"name="username"><br>密码:<input

type="password"name="psd"maxlength=6><br><input

type="submit"

value="提交"><input

type="reset"

value="重填"></form></body></html>跳转到数据处理页面(html/jsp/aspx/php…)get方法提交数据会在URL中显示注意要用name属性才能在地址栏中显示页面和参数之间用?连接参数之间用&连接【返回】11.2

HTTP编程越来越多的

Java应用程序需要直接通过

HTTP

协议来访问网络资源。在

JDK

的 包中已经提供了访问

HTTP

协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK

库本身提供的功能还不够丰富和灵活。除此之外,在Android系统中,Android

SDK集成了Apache的HttpClient模块,用来提供高效的、功能丰富的支持HTTP协议工具包,并且它支持HTTP

协议最新的版本和建议。使用

HttpClient可以快速开发出功能强大的HTTP

程序。HTTP编程2种方法HttpURLConnection编程HttpClient编程【返回】1.

HttpURLConnection编程(以Post为例)提交登录数据给Web服务器网站将结果反馈给Android客户端HttpURLConnection主要步骤(以Post为例)创建URL对象:String

httpUrl="http格式的url地址串";//此处不带参数URL

url

=

new

URL(httpUrl);通过HttpURLConnection创建连接对象:HttpURLConnection

conn

=(HttpURLConnection)

url.openConnection();需要强制转换一下HttpURLConnection主要步骤(以Post为例)3)设置连接的几个重要属性:conn.setConnectTimeout(5000);

//设置连接超时时间,如5秒conn.setRequestMethod("POST");

//使用POST的方式conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);//允许输出输入//允许输入//post方式最好不使用缓存conn.setRequestProperty("Charset","UTF-8");

//设置编码字符集UTF-8

编码用在网页上可以在同一页面显示中文简体繁体及其它语言(如日文,韩文)HttpURLConnection主要步骤(以Post为例)4)准备传送的数据,例如:String

datastr="username="+URLEncoder.encode("wust",

"utf-8")+"&psd="+URLEncoder.encode("123",

"utf-8");byte

[]

data=datastr.getBytes();将字符串编码为utf-8格式将字符串转化为适合物理层传输的字节流到时候这些值来自于文本框的输入HttpURLConnection主要步骤(以Post为例)5)传送数据给服务器:以流的方式DataOutputStream

outputStream

=new

DataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();outputStream.close();//刷新//关闭这里的操作都是Java标准的的I/OHttpURLConnection主要步骤(以Post为例)6)接收服务器响应数据:以流的方式BufferedReader

reader

=

new

BufferedReader(newInputStreamReader(conn.getInputStream()));String

resultData="";

//存放从服务器返回的信息String

line=null;while((line=reader.readLine())!=null){ //使用循环体来获得数据

resultData+=line+"\n";}reader.close();

//关闭这里的操作都是Java标准的的I/OAndroid客户端可以用一个

TextView显示一下resultData第6步之前可加一个判断请求是否成功处理:int

reponseCode

=conn.getResponseCode();if(response==HttpURLConnection.HTTP_OK){第6步代码}(1)服务器端的准备MyEclipse中创建一个Web工程,命名为了“MyServer”。两个JSP网页:index.jsp和login.jspMyEclipse下载地址:index.jsp主要代码<%@

page

language="java"

import="java.util.*"

pageEncoding="utf-8"%><body><form

action="login.jsp" method="post"

>用户名:<input

type="text"name="username"><br>密码:<input

type="password"name="psd"

maxlength=6><br><input

type="submit"

value="提交"><input

type="reset"

value="重填"></form></body>提醒:(1)将jsp文件保存为utf-8格式(2)将页面pageEncoding改为="utf-8"改成get,看看浏览器地址栏区别附:如何将文件保存为utf-8jsp文件右键->Propertylogin.jsp主要代码<%@

page

language="java"

import="java.util.*"

pageEncoding="utf-8"%><body><%String

username=request.getParameter("username");String

psd=request.getParameter("psd");if(username.equals("wust")&&psd.equals("123")){out.print("登录成功!欢迎"+username);}else{out.print("登录失败!");}%></body>运行网站index.jsp网站地址:其中指本地机,一般用来测试使用,也可用localhost代替8080:Web服务器端口号login.jsp(2)

Android客户端准备工作:此将指定给自己很重要AndroidManifest.xml中添加访问权限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推荐在主线程中使用HttpURLConnection(不安全),因此如要强制使用,则需在onCreate中添加代码:StrictMode.ThreadPolicy

policy

=

newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模拟器已

这两句需要

android:minSdkVersion="9"

配合

了,因

要访问本机的服务器,用它设定的另一个地址:主界面<LinearLayout

xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"

><EditTextandroid:id="@+id/editText1"android:hint="请输入用户名"android:layout_width="match_parent"android:layout_height="wrap_content"

><requestFocus

/></EditText><EditTextandroid:id="@+id/editText2"android:hint="请输入密码"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/button1"android:layout_width="110dp"android:layout_height="wrap_content"android:layout_gravity="right"android:text="登录"/><TextViewandroid:id="@+id/textView1"android:textSize="10px"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="结果"/></LinearLayout>注:用户名和密码的textview定义略MainActivity主要代码protected

void

onCreate(Bundle

savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在主线程中强制使用子线程

StrictMode.ThreadPolicy

policy=newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);Buttonbt=(Button)findViewById(R.id.button1);bt.setOnClickListener(new

View.OnClickListener()

{@Overridepublic

void

onClick(View

v)

{String

httpUrl="

";URL

url=null;try

{url

=

newURL(httpUrl);}catch

(MalformedURLException

e1){

Toast.makeText(getApplicationContext(),"无法创建URL",Toast.LENGTH_SHORT).show();}创建URL对象(需要try/catch)注意服务器地址为:8080MainActivity主要代码(续)if(url!=null){HttpURLConnection

conn;try

{conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(3000);conn.setRequestMethod("POST");//设置连接超时时间//Post方式conn.setDoOutput(true);//设置能输出

conn.setDoInput(true);//设置能输入

conn.setUseCaches(false);//不使用缓存conn.setRequestProperty("Charset","UTF-8");

//设置uft-8字符集创建连接对象

并设置相关属性I/O操作也要try/catchMainActivity主要代码(续)//准备要传送给服务器的数据String

username

=

((EditText)findViewById(R.id.editText1)

).getText().toString();String

password

=

((EditText)findViewById(R.id.editText2)

).getText().toString();String

datastr="username="+URLEncoder.encode(username,

"utf-8")+"&psd="+URLEncoder.encode(password

,

"utf-8");byte

[]

data=datastr.getBytes();准备要传送的数据MainActivity主要代码(续)//向服务器发送数据DataOutputStream

outputStream=newDataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();

//刷新outputStream.close();

//关闭//接收服务器返回的信息BufferedReader

reader

=

new

BufferedReader(newInputStreamReader(conn.getInputStream()));String

resultData

=

"";String

line=null;//使用循环体来获得数据while((line

=

reader.readLine())!=null){resultData

+=

line

+

"\n";}reader.close();//关闭发送数据给服务器接收服务器返回的信息服务器返回的信息存放在resultData变量中MainActivity主要代码//用一个TextView来显示数据TextView

tv=

(TextView)findViewById(R.id.textView1);f(!resultData.equals("")){tv.setText(resultData);}else{tv.setText("读取的内容为null");}}catch

(IOException

e)

{e.printStackTrace();Toast.makeText(getApplicationContext(),"出错了!",Toast.LENGTH_SHORT).show();}}

//endif(url!=null)} //endtry});

//endonclick}

//endoncreate显示服务器返回的信息运行情况先确认网站已启动(Web服务器)然后再运行Android客户端2.

HttpClient编程提交登录数据给Web服务器网站将结果反馈给Android客户端服务器端不变HttpClient主要步骤(以Post为例)1)创建HttpClient实例:HttpClient

httpClient

=

new

DefaultHttpClient();2)创建HttpPost请求对象:String

httpUrl="http格式的url地址串";//此处不带参数HttpPost

httpPost

=

new

HttpPost(httpUrl);HttpClient主要步骤(以Post为例)3)设置需要传递的参数://(1)创建参数ArrayList<NameValuePair>

params

=

new

ArrayList<NameValuePair>();params.add(new

BasicNameValuePair("username",

"wustzz"));params.add(new

BasicNameValuePair("psd",

"123456"));//(2)对参数进行utf-8编码UrlEncodedFormEntity

entity

=

new

UrlEncodedFormEntity(params,

"utf-8");//(3)将编码的参数设置给HttpPost对象

httpPost.setEntity(entity);参数名参数值HttpClient主要步骤(以Post为例)发出POST请求并获取服务器反馈:HttpResponse

response

=

httpClient.execute(httpPost);获取服务器返回的内容:String

result="";//判断请求是否成功处理if

(response.getStatusLine().getStatusCode()

==

HttpStatus.SC_OK)

{//获取返回的内容result

=

EntityUtils.toString(response.getEntity(),

"utf-8");}使用EntityUtils工具将Entity转换为uft-8编码的字符串HttpClient主要步骤(以Post为例)6)关闭HttpClient以确保释放所有占用的系统资源:httpClient.getConnectionManager().shutdown();Android客户端准备工作:AndroidManifest.xml中添加访问权限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推荐在主线程中使用HttpURLConnection(不安全),因此如要强制使用,则需在onCreate中添加代码:StrictMode.ThreadPolicy

policy

=

newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模拟器已将指定给自己了,因此要访问本机的服务器,用它设定的另一个地址:很重要这两句需要android:minSdkVersion="9"

配合服务器端没有变化,因此只需设计Android客户端代码MainActivity主要代码protected

void

onCreate(Bundle

savedInstanceState)

{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StrictMode.ThreadPolicy

policy

=

newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);Button

bt=(Button)findViewById(R.id.button1);bt.setOnClickListener(new

View.OnClickListener()

{@Overridepublic

void

onClick(View

v)

{MainActivity主要代码(续)HttpClient

httpClient=new

DefaultHttpClient();String

httpUrl=""; //此处不带参数HttpPost

httpPost

=

new

HttpPost(httpUrl);//(1)创建参数String

username

=

((EditText)findViewById(R.id.editText1)

).getText().toString();String

password

=

((EditText)findViewById(R.id.editText2)

).getText().toString();ArrayList<NameValuePair>params

=

new

ArrayList<NameValuePair>();params.add(new

BasicNameValuePair("username",

username));params.add(new

BasicNameValuePair("psd",

password));try{//(2)对参数进行URL编码UrlEncodedFormEntity

entity

=

new

UrlEncodedFormEntity(params,

"utf-8");//(3)将编码的参数设置给HttpPost对象

httpPost.setEntity(entity);MainActivity主要代码(续)HttpResponse

response

=

httpClient.execute(httpPost);String

result="";if

(response.getStatusLine().getStatusCode()

==

HttpStatus.SC_OK)

{result=EntityUtils.toString(response.getEntity(),"utf-8");//获取返回的内容}else{ result

="读取的内容为null";

}TextViewtv=(TextView)findViewById(R.id.textView1);tv.setText(result

);}catch(Exception

e){e.printStackTrace();Toast.makeText(getBaseContext(),"出错了!",Toast.LENGTH_SHORT).show();}httpClient.getConnectionManager().shutdown();//关闭HttpClient}});}运行情况同前例11.3

调用Web服务什么是Web服务(WebService)?Web服务是一个平台独立的,松耦合的,基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。理解Web服务简单的理解:Web服务是远程的某个服务器对外公开的某种功能或方法, 通过调用该服务以获得我们需要的信息。例如:某个网站对外公开了手机号码归属地查询服务,我们 只需要在调用该服务时传入一个手机号,就能立即获取该号 段的归属地信息。理解Web服务(续)更通俗的理解:通过使用Web服务,我们能够像调用本地方法一样去调用远 程服务器上的方法。我们不需要关心远程的方法是Java写的,还是PHP或C#写 的;我们也不需要关心远程的方法是基于Unix平台,还是

Windows平台,这就是Web服务平台和语言无关性。Web服务示例

一些web服务列表Web服务示例(续)国内手机号码归属地查询WEB

服务,提供最新的国内手机号码段归属地数据,每月更新。调用手机号码归属地查询Web服务编程调用Web服务示例手机号码归属地查询(HttpClient编程)

【完】补充SocketSocket套接字用于描述IP地址和端口,是通信链的句柄应用程序通过Socket发出网络请求或应答网络请求应用程序与TCP/IP协议进行交互的接口Socket的优点服务器端与客户端可以互相主动发送数据保持客户端与服务器端数据的实时与同步与http相比http在请求结束时主动释放连接56Socket(1)Socket通信必须包含的5种信息连接使用的协议(TCP/UDP)本地主机的IP地址本地进程的协议端口远程主机的IP地址远程进程的协议端口Socket的传输模式面向连接的传输无连接的传输57Socket(2)面向连接的Socket操作使用TCP协议连接必须在发送数据之前建立好并保持稳定数据到达顺序是固定的连接建立后可以使用流接口进行打开、读、写、关闭操作所有发送的信息都会在另一端以同样的顺序被接受无连接的Socket操作使用UDP协议不保证发出数据的达到不保证发出数据按照发出顺序达到目的地面向连接的操作比无连接操的效率低,数据的安全 性高58Socket(4)Socket构造Java在包中提供了两个类Socket和ServerSocket分别用来表示双向连接的客户端和服务端每一个端口提供一种特定的服务需要给出正确的端口,才能获得相应的服务0-1023的端口为系统保留在选择端口时最好选择大于1023端口,以防止放生 冲突建立SOCKET连接至少需要一对套接字其中一个运行于客户端,称为ClientSocket另一个运行于服务器端,称为ServerSocket59Android

套接字编程实例—SocketDemo创建Socket的方法:操作Socket的方法

InputStream

getInputStream()

OutputStream

getOutputStream()

void

close()

Socket(InetAddress

remoteAddress,int

remotePort)Socket(5)Socket和ServerSocket类Socket(InetAddress

address,

int

port);Socket(InetAddress

address,

int

port,

boolean

stream);Socket(String

host,

int

port);Socket(String

host,

int

port

,

boolean

stream);Socket(SocketImpl

impl);Socket(String

host,

int

port,

InetAddress

localAddr,

int localPort);Socket(InetAddress

address,

int

port

,

InetAddress

localAddr, int

localPort);ServerSocket(int

port);ServerSocket(int

port,

int

backlog);ServerSocket(int

port

,

int

backlog,

InetAddress

bindAddr);62Socket(6)参数含义address:双相连接中另一方的IP地址host:双相连接中另一方的主机名port

:双相连接中另一方的端口号stream

:指明Socket是流Socket还是数据报SocketlocalPort

:表示本地主机的端口号localAddr

:本地机器的地址(ServerSocket的主机地址)bindAddr

:本地机器的地址(ServerSocket的主机地址)Impl

:Socket的父类可以用来创建ServerSocket或者可以用来创建Socket63Socket(7)常用的构造函数Socket(InetAddress

addr,

int

port)Socket(String

host,

int

port)创建基于Socket的连接服务器端的流套接字创建时的异常创建Socket如果发生错误产生异常IOException程序中必须进行处理创建时必须捕获或抛出异常创建Socket和ServerSocket都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论