Socket和HTTP网络通信
- 格式:docx
- 大小:34.51 KB
- 文档页数:10
Socket和HTTP网络通信在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来对网络数据进行请求。
1、Socket(套接字)不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的。
Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由IP地址和端口号两部分组成。
IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议。
Socket的常见格式为:192.168.1.1: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 Code1package LiB.Demo;23import java.io.BufferedReader;4import java.io.BufferedWriter;5import java.io.IOException;6import java.io.InputStreamReader;7import java.io.OutputStreamWriter;8import .ServerSocket;9import .Socket;1011public class SocketHelper {12private static ServerSocket serverSocket = null; 13private static Socket client = null;14private final static int port = 9048;15private static BufferedReader br= null;16private static BufferedWriter bw = null;1718/**19 * 创建一个SocketServer对象用来建立服务器20 * @throws IOException21*/22public static void CreateServer() throws IOExcepti on23 {24 serverSocket = new ServerSocket(port,10);25 System.out.println("start listening...");26 }2728/**29 * 创建一个Socket对象用来连接SocketServer对象30 * @param dstName Server对象的ip地址31 * @return32 * @throws IOException33*/34public static Socket CreateClient(String dstName) throws IOException35 {36 Socket socket = new Socket(dstName, port);37//Socket sockets = new Socket("192.168.8.12",p ort);38return socket;39 }4041/**42 * 返回一个已经连接到服务器上的Socket对象43 * @throws IOException44*/45public static void GetClinetSocket() throws IOExce ption46 {47 client = serverSocket.accept();48 System.out.println("get a connected client");49 }5051/**52 * 向socket对象所获取的流中发送数据53 * @param socket54 * @param msg55 * @throws IOException56*/57public static void SendMsg(Socket socket , String msg) throws IOException58 {59 bw = new BufferedWriter(new OutputStreamWriter (socket.getOutputStream()));60 bw.write(msg);61 bw.flush();62 bw.close();63 }6465/**66 * 获取socket对象流中数据67 * @param socket68 * @param msg69 * @return70 * @throws IOException71*/72public static String ReceiveMsg(Socket socket, Str ing msg) throws IOException73 {74 br = new BufferedReader(new InputStreamReader (socket.getInputStream()));75 String receiveMsg = "Receive msg:"+ br.readLin e();76 br.close();77return receiveMsg;78 }7980/**81 * 释放socket对象82 * @throws IOException83*/84public static void Close() throws IOException85 {86if(client != null)87 {88 client.close();89 }90if(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。
HttpURLConnectionHttpURLConnection是继承自URLConnection的一个抽象类,在HTTP编程时,来自HttpURLConnection的类是所有操作的基础,获取该对象的代码如下:View Code1public HttpURLConnection urlconn= null;2private void Init() throws IOException3 {4if (urlStr=="")5 {6 urlStr="";7 }8 URL url = new URL(urlStr);9//打开一个URL所指向的Connection对象10 urlconn = (HttpURLConnection)url.openConnection();11 }复制代码HttpURLConnection对网络资源的请求在默认情况下是使用GET方式的,所以当使用GET方式时,不需要我们做太多的工作:View Code1public HttpURLConnection urlconn= null;2private void Init() throws IOException3 {4if (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 格式通常为:"/xx.aspx?param=value"14 * 在android中默认的http请求为get方式15 * @return16 * @throws IOException17*/18public String HttpGetMethod() throws IOException 19 {20if(urlconn == null)21 {22 Init();23 }24 String result = StreamDeal(urlconn.getInputStr eam());25 urlconn.disconnect();26return result;27 }复制代码当我们需要使用POST方式时,就需要使用setRequestMethod()来设置请求方式了。