已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket 和 HTTP 网络通信 在 Android 的网络通讯中,通常会使用 Socket 进行设备间数的数据通讯,使用 Http 来 对网络数据进行请求。 1、Socket(套接字) 不管是有过 Java 开发经验还是.NET 开发经验的同学都应该对 Socket 有或多或少 的了解,常见的 TCP 或者 UDP 协议其实都是基于 Socket 来实现的。 Socket 是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket 由 IP 地址和端口号两部分组成。IP 地址用来定位设备,端口号用来定位 应用程序或者进程, 比如我们常见的运行在 80 端口上的 HTTP 协议。Socket 的常见格式为: :1234。 那么应用程序是如何通过 Socket 来与网络中的其他设备进行通讯的呢?通常情况 下,Socket 通信有两部分,一部分为监听的 Server 端,一部分为 主动请求连接的 Client 端。Server 端会一直监听 Socket 中的端口直到有请求为止,当 Client 端对该端 口进行连接请求时,Server 端 就给予应答并返回一个 Socket 对象,以后在 Server 端 与 Client 端的数据交换就可以使用这个 Socket 来进行操作了。 2、Android 中使用 Socket 进行数据交换 ServerSocket 建立服务端(Server)时,需要使用 ServerSocket 对象,这个对象会自动对其构造 函数中传入的端口号进行监听,并在收到连接请求后,使 用 ServerSocket.accept()方 法返回一个连接的的 Socket 对象。这个方法并不需要我们像在.NET 中那样使用 Start 方 法,它会 自动进行监听的。 Socket 不管建立客户端(Client)还是在进行其他数据交换方面的操作时,都需要使用 Socket 类。Socket 类在进行初始化时需要出入 Server 端的 IP 地址和端口号,并返回 连接到 Server 端的一个 Socket 对象,如果是连接失败,那么将返回异常。同 ServerSocket,也是自动进行 连接请求的。 通过上面两个步骤后,Server 端和 Client 端就可以连接起来了,但是仅仅连接起来 是没有任何作用的,数据交换才是我们的目的,这时候就需要用到 IO 流中的 OutputStream 类和 InputStream 类。 OutputStream可写流 当应用程序需要对流进行数据写操作时,可以使用 Socket.getOutputStream()方 法返回的数据流进行操作。 InputStream可读流 当应用程序要从流中取出数据时,可以使用 Socket.getInputStream()方法返回的 数据流进行操作。 看看完整的代码吧 View Code 1 package LiB.Demo; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import .ServerSocket; 9 import .Socket; 10 11 public class SocketHelper 12 private static ServerSocket serverSocket = null; 13 private static Socket client = null; 14 private final static int port = 9048; 15 private static BufferedReader br= null; 16 private static BufferedWriter bw = null; 17 18 /* 19 * 创建一个 SocketServer 对象用来建立服务器 20 * throws IOException 21 */ 22 public static void CreateServer() throws IOExcepti on 23 24 serverSocket = new ServerSocket(port,10); 25 System.out.println(“start listening.“); 26 27 28 /* 29 * 创建一个 Socket 对象用来连接 SocketServer 对象 30 * param dstName Server 对象的 ip 地址 31 * return 32 * throws IOException 33 */ 34 public static Socket CreateClient(String dstName) throws IOException 35 36 Socket socket = new Socket(dstName, port); 37 /Socket sockets = new Socket(“2“,p ort); 38 return socket; 39 40 41 /* 42 * 返回一个已经连接到服务器上的 Socket 对象 43 * throws IOException 44 */ 45 public static void GetClinetSocket() throws IOExce ption 46 47 client = serverSocket.accept(); 48 System.out.println(“get a connected client“); 49 50 51 /* 52 * 向 socket 对象所获取的流中发送数据 53 * param socket 54 * param msg 55 * throws IOException 56 */ 57 public static void SendMsg(Socket socket , String msg) throws IOException 58 59 bw = new BufferedWriter(new OutputStreamWriter (socket.getOutputStream(); 60 bw.write(msg); 61 bw.flush(); 62 bw.close(); 63 64 65 /* 66 * 获取 socket 对象流中数据 67 * param socket 68 * param msg 69 * return 70 * throws IOException 71 */ 72 public static String ReceiveMsg(Socket socket, Str ing msg) throws IOException 73 74 br = new BufferedReader(new InputStreamReader( socket.getInputStream(); 75 String receiveMsg = “Receive msg:“+ br.readLin e(); 76 br.close(); 77 return receiveMsg; 78 79 80 /* 81 * 释放 socket 对象 82 * throws IOException 83 */ 84 public static void Close() throws IOException 85 86 if(client != null) 87 88 client.close(); 89 90 if(serverSocket != null) 91 92 serverSocket.close(); 93 94 95 复制代码 3、HTTP 通讯 在开始前先简单介绍下 HTTP 协议中的两种不同的请求方式GET 和 POST。GET 方式在进行数据请求时,会把数据附加到 URL 后面传递给服务 器,比如常见的: http:/XXX.XXX.XXX/XX.aspx?id=1,POST 方式则是将请求的数据放到 HTTP 请求 头中,作为请求头的一 部分传入服务器。所以,在进行 HTTP 编程前,首先要明确究竟使 用的哪种方式进行数据请求的。 在 Android 中,可以有两种方式可以用来进行 Http 编程: 1、HttpURLConnection;2、HttpClient。 HttpURLConnection HttpURLConnection 是继承自 URLConnection 的一个抽象类,在 HTTP 编程时, 来自 HttpURLConnection 的类是所有操作的基础,获取该对象的代码如下: View Code 1 public HttpURLConnection urlconn= null; 2 private void Init() throws IOException 3 4 if (urlStr=“) 5 6 urlStr=““; 7 8 URL url = new URL(urlStr); 9 /打开一个 URL 所指向的 Connection 对象 10 urlconn = (HttpURLConnection)url.openConnectio n(); 11 复制代码 HttpURLConnection 对网络资源的请求在默认情况下是使用 GET 方式的,所以当使 用 GET 方式时,不需要我们做太多的工作: View Code 1 public HttpURLConnection urlconn= null; 2 private void Init() throws IOException 3 4 if (urlStr=“) 5 6 urlStr=““; 7 8 URL url = new URL(urlStr); 9 /打开一个 URL 所指向的 Connection 对象 10 urlconn = (HttpURLConnection)url.openConnectio n(); 11 12 /* 13 * Http 中的 get 请求,在 Url 中带有请求的参数,请求的 URL 格 式通常为:“http:/XXX.XXXX.com/xx.aspx?param=value “ 14 * 在 android 中默认的 http 请求为 get 方式 15 * return 16 * throws IOException 17 */ 18 public String HttpGetMethod() throws IOException 19 20 if(urlconn = null) 21 22 Init(); 23 24 String result = StreamDeal(urlconn.getInputStr eam(); 25 urlconn.disconnect(); 26 return result; 27 复制代码 当我们需要使用 POST 方式时,就需要使用 setRequestMethod()来设置请求方式 了。 View Code 1 /* 2 * Http 中的 post 请求,不在 Url 中附加任何参数,这些参数都 会通过 cookie 或者 session 等其他方式以键值对的形式 key=value 传送 到服务器上,完成一次请求 3 * 请求的 URL 格式通常为:“http:/XXX.XXXX.com/xx.aspx“ 4 * param param 请求的键名 5 * param value 请求的数据值 6 * throws IOException 7 */ 8 public String HttpPostMethod(String key,String val ue) throws IOException 9 10 if (urlconn=null) 11 12 Init(); 13 14 /设置该 URLConnection 可读 15 urlconn.setDoInput(true); 16 /设置该 URLConnection 可写 17 urlconn.setDoOutput(true); 18 /使用 POST 方式来提交数据 19 urlconn.setRequestMethod(“POST“); 20 /不运行缓存 21 urlconn.setUseCaches(false); 22 /当使用 POST 方式进行数据请求时,我们可以手动执行 conn ect 动作,当然,这个动作其实在 getOutputStream()方法中会默认执行的 23 /上面那些设置 URLConnection 属性的动作,一定要在 connect 动作 执行前,因为一旦动作已经执行,熟悉设置就没有任何作用了 24 urlconn.connect(); 25 /使用 POST 方式时,我们需要自己构造部分 Http 请求的内容 ,因此我们需要使用 OutputStream 来进行数据写如操作 26 OutputStreamWriter writer = new OutputStreamWr iter(urlconn.getOutputStream(); 27 28 String urlQueryStr = key+“=“+URLEncoder.encode (value, “Utf-8“); 29 writer.write(urlQueryStr); 30 31 writer.flush(); 32 writer.close(); 33 /获取返回的内容 34 String result = StreamDeal(urlconn.getInputStr eam(); 35 return result; 36 37 复制代码 HttpClient 这个类并不是来自 Android 的,而是来自 org.apache.http。和 HttpURLConnection 相同,HttpClient 也存在 GET 和 POST 两种方式。 HttpGet 在 HttpClient 中,我们可以非常轻松使用 HttpGet 对象来通过 GET 方式进 行数据请求操作,当获得 HttpGet 对象后我们可以 使用 HttpClient 的 execute 方法来 向我们的服务器发送请求。在发送的 GET 请求被服务器相应后,会返回一个 HttpResponse 响应对 象,利用这个响应的对象我们能够获得响应回来的状态码,如: 200、400、401 等等。 View Code 1 public String HttpGetMethod() 2 3 String result = “; 4 try 5 6 HttpGet httpRequest = new HttpGet(urlStr); 7 HttpClient httpClient = new DefaultHttpClient(); 8 HttpResponse httpResponse = httpClient.execute (httpRequest); 9 if(httpResponse.getStatusLine().getStatusCode()= =HttpStatus.SC_OK) 10 11 result = EntityUtils.toString(httpResponse.g etEntity(); 12 13 else 14 15 result = “null“; 16 17 return result; 18 19 catch(Exception e) 20 21 return null; 22 23 复制代码 HttpPost 当我们使用 POST 方式时,我们可以使用 HttpPost 类来进行操作。当获取 了 HttpPost 对象后,我们就需要向这个请求体传入键值 对,这个键值对我们可以使用 NameValuePair 对象来进行构造,然后再使用 HttpRequest 对象最终构造我们的请求 体,最后使用 HttpClient 的 execute 方法来发送我们的请求,并在得到响应后返回一个 HttpResponse 对象。其他操作和我们在 HttpGet 对象 中的操作一样。 View Code 1 public String HttpPostMethod(String key,String value) 2 3 String result
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国卫星网络招聘题库及答案
- 楼体字安装合同范本
- 水果基地代销合同范本
- 气球用品采购合同范本
- 施工环保管理协议书
- 阜新吊车出租合同范本
- 防止客户差评协议合同
- 棚户区购买协议合同
- 施工征地协议书范本
- 新房屋购房合同范本
- 光伏储能可行性研究报告
- 基坑施工冬季施工技术及管理方案
- 儿童故事狼和小羊
- 青海省西宁市2024-2025学年七年级上学期期末调研测试道德与法治试卷(含答案)
- 2025年安徽省合肥市高一数学上册期中考试试卷及答案
- 【MOOC】《人工智能通识基础(社会科学)》(国家高等教育智慧教育平台)章节作业慕课答案
- 2025温州市工业与能源发展集团有限公司2025年面向社会公开招聘工作人员6人考试笔试备考试题及答案解析
- 2025年湖南单招试卷真题文化试题及答案
- GB/T 46425-2025煤矸石山生态修复技术规范
- 2025-2030晶振行业废料回收处理技术与环保合规成本测算研究
- 函数的连续性教例教案(2025-2026学年)
评论
0/150
提交评论