网络通信学习文档.docx
- 文档编号:4869907
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:63.17KB
网络通信学习文档.docx
《网络通信学习文档.docx》由会员分享,可在线阅读,更多相关《网络通信学习文档.docx(22页珍藏版)》请在冰豆网上搜索。
网络通信学习文档
Android的网络编程分为2种:
基于socket协议的,和基于http协议的。
●Http通信
●以xml或者JSON为载体,相互通信数据。
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。
JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。
●Socket通信
Socket与Http不同的是两个的协议不同,socket是面向TCP/UDP协议的,http通信是面向HTTP协议的。
Android对于http网络通信,提供了标准的java接口——httpURLConnection接口,以及apache的接口——httpclient接口。
同时http通信也分为post方式和get的方式,两个相比较的话,post传送的数据量比较大,安全性也比较高。
1.Http通信
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,通过Android单元测试来完成这四种方法。
包中的HttpURLConnection类 Get方式:
//Get方式请求
publicstaticvoidrequestByGet()throwsException{
Stringpath="
//新建一个URL对象
URLurl=newURL(path);
//打开一个HttpURLConnection连接
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
//设置连接超时时间
urlConn.setConnectTimeout(5*1000);
//开始连接
urlConn.connect();
//判断请求是否成功
if(urlConn.getResponseCode()==HTTP_200){
//获取返回的数据
byte[]data=readStream(urlConn.getInputStream());
Log.i(TAG_GET,"Get方式请求成功,返回数据如下:
");
Log.i(TAG_GET,newString(data,"UTF-8"));
}else{
Log.i(TAG_GET,"Get方式请求失败");
}
//关闭连接
urlConn.disconnect();
}
HttpURLConnection类Post方式:
//Post方式请求
publicstaticvoidrequestByPost()throwsThrowable{
Stringpath="
//请求的参数转换为byte数组
Stringparams="id="+URLEncoder.encode("helloworld","UTF-8")
+"&pwd="+URLEncoder.encode("android","UTF-8");
byte[]postData=params.getBytes();
//新建一个URL对象
URLurl=newURL(path);
//打开一个HttpURLConnection连接
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
//设置连接超时时间
urlConn.setConnectTimeout(5*1000);
//Post请求必须设置允许输出
urlConn.setDoOutput(true);
//Post请求不能使用缓存
urlConn.setUseCaches(false);
//设置为Post请求
urlConn.setRequestMethod("POST");
urlConn.setInstanceFollowRedirects(true);
//配置请求Content-Type
urlConn.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
//开始连接
urlConn.connect();
//发送请求参数
DataOutputStreamdos=newDataOutputStream(urlConn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
//判断请求是否成功
if(urlConn.getResponseCode()==HTTP_200){
//获取返回的数据
byte[]data=readStream(urlConn.getInputStream());
Log.i(TAG_POST,"Post请求方式成功,返回数据如下:
");
Log.i(TAG_POST,newString(data,"UTF-8"));
}else{
Log.i(TAG_POST,"Post方式请求失败");
}
}
org.apache.http包中的Get方式:
//HttpGet方式请求
publicstaticvoidrequestByHttpGet()throwsException{
Stringpath="
//新建HttpGet对象
HttpGethttpGet=newHttpGet(path);
//获取HttpClient对象
HttpClienthttpClient=newDefaultHttpClient();
//获取HttpResponse实例
HttpResponsehttpResp=httpClient.execute(httpGet);
//判断是够请求成功
if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
//获取返回的数据
Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
Log.i(TAG_HTTPGET,"HttpGet方式请求成功,返回数据如下:
");
Log.i(TAG_HTTPGET,result);
}else{
Log.i(TAG_HTTPGET,"HttpGet方式请求失败");
}
}
org.apache.http包中的Post方式:
//HttpPost方式请求
publicstaticvoidrequestByHttpPost()throwsException{
Stringpath="
//新建HttpPost对象
HttpPosthttpPost=newHttpPost(path);
//Post参数
List
params.add(newBasicNameValuePair("id","helloworld"));
params.add(newBasicNameValuePair("pwd","android"));
//设置字符集
HttpEntityentity=newUrlEncodedFormEntity(params,HTTP.UTF_8);
//设置参数实体
httpPost.setEntity(entity);
//获取HttpClient对象
HttpClienthttpClient=newDefaultHttpClient();
//获取HttpResponse实例
HttpResponsehttpResp=httpClient.execute(httpPost);
//判断是够请求成功
if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
//获取返回的数据
Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
Log.i(TAG_HTTPGET,"HttpPost方式请求成功,返回数据如下:
");
Log.i(TAG_HTTPGET,result);
}else{
Log.i(TAG_HTTPGET,"HttpPost方式请求失败");
}
}
Socket通信
1. 什么是Socket?
Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开了一个文件句柄,将数据读写到稳定的存储器上一样。
使用Socket可以将应用程序添加到网络中,并与处于同一网络中的其他应用程序进行通信。
一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之依然。
根据不同的的底层协议实现,也会很多种不同的Socket。
本课当中只覆盖了TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(stream socket)和数据报套接字(datagram socket)。
流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。
数据报套接字使用UDP协议,提供可一个“尽力而为”的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。
2. 使用基于TCP协议的Socket
一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。
然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如192.168.1.1),也可以是主机名()。
在Java当中InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。
下面为大家介绍一下基于TCP协议操作Socket的API:
ServerSocket:
这个类是实现了一个服务器端的Socket,利用这个类可以监听来自网络的请求。
a)创建ServerSocket的方法:
ØServerSocket(Int localPort)
ØServerSocket(int localport,int queueLimit)
ØServerSocket(int localport,int queueLimit,InetAddress localAddr)
创建一个ServerSocket必须指定一个端口,以便客户端能够向该端口号发送连接请求。
端口的有效范围是0-65535,注意0-1024是系统保留端口,不要使用)
ServerSocket操作
Socket accept()和void close()
accept()方法为下一个传入的连接请求创建Socket实例,并将已成功连接的Socket实例返回给服务器套接字,如果没有连接请求,accept()方法将阻塞等待; close方法用于关闭套接字 。
Socket:
a) 创建Socket的方法:
Socket(InetAddress remoteAddress,int remotePort)
利用Socket的构造函数,可以创建一个TCP套接字后,先连接到指定的远程地址和端口号。
b) 操作Socket的方法:
InputStream getInputStream()、OutputStream getOutputStream()和void close() 。
使用基于UDP的Socket :
a) 创建DatagramPacket
DatagramSocket(byte [] data,int offset,int length,InetAddress remoteAddr,int remotePort) 该构造函数创建一个数据报文对象,数据包含在第一个参数当中
b) 创建DatagramSocket创建 DatagramSocket(int localPort)
以上构造函数将创建一个UDP套接字;
c) DatagramSocket:
发送和接受
void send(DatagramPacket packet) void receive(DatagramPacket packet)
send()方法用来发送DatagramPacket实例。
一旦创建连接,数据报将发送到该套接字所连接的地址;
receive()方法将阻塞等待,直到接收到数据报文,并将报文中的数据复制到指定的DatagramPacket实例中。
Socket的TCP应用实例 Server端代码:
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
publicclassServer{
privateServerSocketss;
privateSocketsocket;
privateDataInputStreamin;
privateDataOutputStreamout;
publicServer(){
newServerThread().start();
}
classServerThreadextendsThread{
publicvoidrun(){
try{
ss=newServerSocket(7777);
System.out.println("服务器启动了");
while(true){
socket=ss.accept();
System.out.println("有客户端连接到服务器");
in=newDataInputStream(socket.getInputStream());
out=newDataOutputStream(socket.getOutputStream());
Stringmsg="";
if((msg=in.readUTF())!
=null){
System.out.println(msg);
}
out.writeUTF("恭喜你,连接服务器成功!
");
out.flush();
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
in.close();
out.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
publicvoidmain(String[]args)throwsIOException{
newServer();
}
}
Client端代码:
publicclassClientTCPextendsActivity{
privateButtonbutton;
privateTextViewtext;
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
text=(TextView)findViewById(R.id.text);
button.setOnClickListener(newConnetListener());
}
classConnetListenerimplementsOnClickListener{
privateSocketsocket=null;
privateDataInputStreamin=null;
privateDataOutputStreamout=null;
publicvoidonClick(Viewv){
try{
System.out.println("msg");
socket=newSocket("192.168.120.143",7777);
out=newDataOutputStream(socket.getOutputStream());
in=newDataInputStream(socket.getInputStream());
out.writeUTF("给我数据啊。
。
。
");
out.flush();
Stringmsg="";
if((msg=in.readUTF())!
=null){
text.setText(msg);
System.out.println("msg1"+msg);
}
System.out.println("msg2"+msg);
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
对AndroidManifest.xml的配置一定不要忘了:
name="android.permission.INTERNET"/> JSON数据格式: 1、JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。 JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 2、JSON的结构: (1) Name/Value Pairs(无序的): 类似所熟知的Keyed list、 Hash table、Disctionary和Associative array。 在Android平台 中同时存在另外一个类 "Bundle",某种程度上具有相似的行为。 (2) Array(有序的): 一组有序的数据列表。 ØObject是一个无序的Name/Value Pairs集合。 {name: value , name: value , name: value .... } ØArray是值(value)的有序集合。 [ value , value , value ...... ] 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。 这些结构可以嵌套。 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。 一个字符(character)即一个单独的字符串(character string)。 例如: \ +”\ / b f n r t u 进行转义。 例子1: Array里面包含对象(Object) [ {"id": 1,"name": "小猪" ,"age”: 22} , {"id": 2,"name": "小猫","age”: 23} , .......] 例子2: 同样对象(object)中可以包含Array Ø一个对象包含1个数组,2个子对象 {"root": [{"id": "001","name": "小猪"},{"id": "002","name": "小猫"},{"id": "003","name": "小狗"}], "total": 3, "success": true } Ø也可以对象嵌套子对象,子对象再嵌套数组 {"calendar": {"calendarlist": [{"id": "001","name": "小猪"},{"id": "002","name": "小猫"}]}} 总之,格式多种多样,可以互相嵌套 --------------------------------------------------------------------------------------------------------------------------------- 在Android中包含四个与JSON相关的类和一个Exceptions: JSONArray、JSONObject、JSONStringer、JSONTokener、JSONException (1)JSONObject: 这是系统中有关JSON定义的基本单元,其包含一对(Key/Value)数值。 它对外部(External: 应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如: {“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”: ”分隔)。 其对于内部(Internal)行为的操作格式略微,例如: 初始化一个JSONObject实例,引用内部的put()方法添加数值: new JSONObject().put(“JSON”, “Hello, Wor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 通信 学习 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)