网络编程:Http通信与Socket通信

http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note

网络编程:Http通信与Socket通信(移动互联核心)

知识点概述:

1.Socket通信:面向连接(TCP)和无连接的(UDP)

2.HttpURLConnection 接口:Get和Post方式

3.HttpClient接口:Get和Post方式

知识点详述:

1 Socket通信

Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。

OSI七层模型

http://baike.baidu.com/link?url=IjtpbJnn2-ix3RodTD5ealQQDyGYHmLwijPAxKd09MjC3Mu5adwU11NYkiqz0T8u6smlFMUV3LQ_8rINPDszRK

http://baike.baidu.com/link?url=VAtmToLvcZfet7n91-h4YCjH0ix7wejqEtM_OqmNQJsX7JoKgc7soWPLlQXuSYa-2aePtbkefyO0yQuRYEKnPq

TCP与UDP区别:

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。

Android Socket编程

(1)服务器实现步骤:

指定端口实例化一个ServerSocket                                                               1. 实例化ServerSocket实例,指定端口号

调用ServerSocket的accept()以在等待连接期间造成阻塞                        2. 调用accept方法,等待客户端请求

获取位于该底层Socket的流以进行读写操作                                                 3. 有请求则返回Socket连接实例

将数据封装成流                                                                                            4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应

对Socket进行读写                                                                                        5.关闭流

关闭打开的流

ServerSocket ss = null;

// 创建一个ServerSocket,监听一个端口号

try {

ss = new ServerSocket(8080);

// 等待一个socket连接

Socket s = ss.accept();

// 缓冲读取数据类

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

// 从流中读取一行数据

String msgFromClient = br.readLine();

System.out.println("msgFromClient:" + msgFromClient);

// 参数2:true 表示数据自动刷新

PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);

pw.println("接受到了!");

//刷新数据

pw.flush();

} catch (IOException e) {

e.printStackTrace();

}

(2)客户端实现步骤:

通过IP地址和端口实例化Socket,请求连接服务器                   1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号

获取Socket上的流以进行读写                                                  2. 通过Socket获取输出流向服务端发送消息

把流包装进BufferedReader/PrintWriter的实例                      3.再通过Socket获取输入流读取服务端响应数据

对Socket进行读写                                                                    4.关闭流

关闭打开的流

Socket s = null;

try {

//和服务器断建立连接

s = new Socket("127.0.0.1", 8080);

//将输出流输出

PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));

pw.println("我是客户端,我给你一些数据");

// 刷新提交过去

pw.flush();

//接收客户端的消息

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

String msgFromServer = br.readLine();

System.out.println("msgFromServer:" + msgFromServer);

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

作业: http://www.cnblogs.com/-run/archive/2011/12/29/2306363.html

前序:HTTP通信 (B/S, C/S)

HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、

客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。

2.HttpURLConnection 接口 java.net.*提供

HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:

connection.setDoOutput(true); //设置输入流(Post时必须设置)

connection.setDoInput(true); // 设置输出流(Post时必须设置)

connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)

connection.setInstanceFollowRedirects(true); //设置该请求是否重定向

connection.disconnect(); //关闭HttpURLConnection连接

connection.setConnectionTimeout(int time); //设置连接超时

connection.setReadTimeout(int time); //设置读取超时

注:如果使用post方式,还需要设置请求的Content-Type

connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:

HttpClient实现移动互联的步骤,以及需要的类:

1) 封装请求  HttpGet / HttpPost

2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams

注:如果是Get方式则省略3)4)步骤

3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity

4 )  设置请求参数   HttpPost-->setEntity(请求参数)

5) 封装执行请求的客户端实例并且设置连接参数  HttpClient--》DefaultHttpClient(HttpParams)

6)发送请求,接收响应  client.execute(HttpGet/HttpPost)--->HttpResponse

7 ) 判断响应码是否是200,如果正常则接收响应数据  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity

8 ) 根据响应数据类型进行转换

(图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())

(文本--》EntityUtils.toString(HttpEntity, "utf-8")

(1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串

String strResult = EntityUtils.toString(httpResponse.getEntity());

HttpClient的Get方式请求步骤:

?封装HttpGet请求 new HttpGet(urlStr)

?      通过HttpParams设置连接参数

?获取HttpClient实例  new DefaultHttpClient();

?发送请求,接收响应

HttpResponse = httpClient.excute(httpGet)

?判断响应码是不是200.如果是200,接收响应数据

HttpEntity  = httpResponse.getEntity();

HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,

HttpPost httpRequest=new HttpPost("url");

需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,

List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair来保存要传递的Post参数

params.add(new BasicNameValuePair("par","HttpClient_android_Post"));

//添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,

HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //设置字符集

httpRequest.setEntity(httpentity);  //为请求设置实体元信息

(2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。

代码如下:HttpClient hc=new DefaultHttpClient();

(3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:

HttpResponse hresponse=hc.execute(httpRequest);

if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功

}

示例代码:

//HttpClient接口通过Post方式获取数据

private String requestStringGet(String urlStr, String param){

String content = "";

//构建Post请求

HttpPost request = new HttpPost(urlStr);

//构建设置连接参数实例

HttpParams connParams = new BasicHttpParams();

//设置连接超时

HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);

//设置Socket超时

HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);

//构建请求参数

List<NameValuePair> requestParams = new ArrayList<NameValuePair>();

requestParams.add(new BasicNameValuePair("name", param));

requestParams.add(new BasicNameValuePair("pass", param));

try{

//将请求参数列表转化为请求实体元信息

HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");

//将请求实体元信息设置到请求中

request.setEntity(paramEntity);

//获取执行请求的HttpClient

HttpClient client = new DefaultHttpClient(connParams);

//执行请求,获取响应

HttpResponse response = client.execute(request);

//判断是否正确响应

if(response.getStatusLine().getStatusCode() == 200){

//获取响应内容

HttpEntity entity = response.getEntity();

if(entity!=null){

content = EntityUtils.toString(entity, "utf-8");

Log.d("TAG", "content: " + content);

content = parseJson(content).toString();

}else{

content = "服务器没有给出响应内容";

}

}else{

content = "获取响应失败!";

}

}catch(SocketTimeoutException e){

Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();

}catch(IOException e){

e.printStackTrace();

Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();

}

return content;

}

如何避免ANR:

Thread + Handler

AsyncTask

关于Handler:

http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html

http://blog.csdn.net/cugbabybear/article/details/8805159

http://blog.sina.com.cn/s/blog_6ee33f040101d7bx.html

关于AsyncTask:

AsyncTask:异步任务类<----------------------->handler

//如果我有耗时工作,并且耗时工作结束之后要更新UI

异步任务的泛型类型

AsynTask<参数,进度条参数,返回值>

启动异步任务类:  调用  execute(参数); //不定长参数

当调用execute的时候执行 doInBackground(参数)。

doInBackground方法在子线程执行,当其执行完毕后返回返回值,

然后执行onPostExe

扩展: 网络通信的中文乱码问题

网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。

一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成

Unicode字符集了。

另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:

使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组

再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码

作业描述:

访问服务器文件内容并通过TextView将内容显示出来

要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范

2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范

http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note

网络编程:Http通信与Socket通信(移动互联核心)

知识点概述:

1.Socket通信:面向连接(TCP)和无连接的(UDP)

2.HttpURLConnection 接口:Get和Post方式

3.HttpClient接口:Get和Post方式

知识点详述:

1 Socket通信

Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。

OSI七层模型

http://baike.baidu.com/link?url=IjtpbJnn2-ix3RodTD5ealQQDyGYHmLwijPAxKd09MjC3Mu5adwU11NYkiqz0T8u6smlFMUV3LQ_8rINPDszRK

http://baike.baidu.com/link?url=VAtmToLvcZfet7n91-h4YCjH0ix7wejqEtM_OqmNQJsX7JoKgc7soWPLlQXuSYa-2aePtbkefyO0yQuRYEKnPq

TCP与UDP区别:

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。

Android Socket编程

(1)服务器实现步骤:

指定端口实例化一个ServerSocket                                                               1. 实例化ServerSocket实例,指定端口号

调用ServerSocket的accept()以在等待连接期间造成阻塞                        2. 调用accept方法,等待客户端请求

获取位于该底层Socket的流以进行读写操作                                                 3. 有请求则返回Socket连接实例

将数据封装成流                                                                                            4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应

对Socket进行读写                                                                                        5.关闭流

关闭打开的流

ServerSocket ss = null;

// 创建一个ServerSocket,监听一个端口号

try {

ss = new ServerSocket(8080);

// 等待一个socket连接

Socket s = ss.accept();

// 缓冲读取数据类

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

// 从流中读取一行数据

String msgFromClient = br.readLine();

System.out.println("msgFromClient:" + msgFromClient);

// 参数2:true 表示数据自动刷新

PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);

pw.println("接受到了!");

//刷新数据

pw.flush();

} catch (IOException e) {

e.printStackTrace();

}

(2)客户端实现步骤:

通过IP地址和端口实例化Socket,请求连接服务器                   1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号

获取Socket上的流以进行读写                                                  2. 通过Socket获取输出流向服务端发送消息

把流包装进BufferedReader/PrintWriter的实例                      3.再通过Socket获取输入流读取服务端响应数据

对Socket进行读写                                                                    4.关闭流

关闭打开的流

Socket s = null;

try {

//和服务器断建立连接

s = new Socket("127.0.0.1", 8080);

//将输出流输出

PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));

pw.println("我是客户端,我给你一些数据");

// 刷新提交过去

pw.flush();

//接收客户端的消息

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

String msgFromServer = br.readLine();

System.out.println("msgFromServer:" + msgFromServer);

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

作业: http://www.cnblogs.com/-run/archive/2011/12/29/2306363.html

前序:HTTP通信 (B/S, C/S)

HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、

客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。

2.HttpURLConnection 接口 java.net.*提供

HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:

connection.setDoOutput(true); //设置输入流(Post时必须设置)

connection.setDoInput(true); // 设置输出流(Post时必须设置)

connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)

connection.setInstanceFollowRedirects(true); //设置该请求是否重定向

connection.disconnect(); //关闭HttpURLConnection连接

connection.setConnectionTimeout(int time); //设置连接超时

connection.setReadTimeout(int time); //设置读取超时

注:如果使用post方式,还需要设置请求的Content-Type

connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:

HttpClient实现移动互联的步骤,以及需要的类:

1) 封装请求  HttpGet / HttpPost

2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams

注:如果是Get方式则省略3)4)步骤

3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity

4 )  设置请求参数   HttpPost-->setEntity(请求参数)

5) 封装执行请求的客户端实例并且设置连接参数  HttpClient--》DefaultHttpClient(HttpParams)

6)发送请求,接收响应  client.execute(HttpGet/HttpPost)--->HttpResponse

7 ) 判断响应码是否是200,如果正常则接收响应数据  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity

8 ) 根据响应数据类型进行转换

(图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())

(文本--》EntityUtils.toString(HttpEntity, "utf-8")

(1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串

String strResult = EntityUtils.toString(httpResponse.getEntity());

HttpClient的Get方式请求步骤:

?封装HttpGet请求 new HttpGet(urlStr)

?      通过HttpParams设置连接参数

?获取HttpClient实例  new DefaultHttpClient();

?发送请求,接收响应

HttpResponse = httpClient.excute(httpGet)

?判断响应码是不是200.如果是200,接收响应数据

HttpEntity  = httpResponse.getEntity();

HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,

HttpPost httpRequest=new HttpPost("url");

需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,

List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair来保存要传递的Post参数

params.add(new BasicNameValuePair("par","HttpClient_android_Post"));

//添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,

HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //设置字符集

httpRequest.setEntity(httpentity);  //为请求设置实体元信息

(2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。

代码如下:HttpClient hc=new DefaultHttpClient();

(3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:

HttpResponse hresponse=hc.execute(httpRequest);

if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功

}

示例代码:

//HttpClient接口通过Post方式获取数据

private String requestStringGet(String urlStr, String param){

String content = "";

//构建Post请求

HttpPost request = new HttpPost(urlStr);

//构建设置连接参数实例

HttpParams connParams = new BasicHttpParams();

//设置连接超时

HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);

//设置Socket超时

HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);

//构建请求参数

List<NameValuePair> requestParams = new ArrayList<NameValuePair>();

requestParams.add(new BasicNameValuePair("name", param));

requestParams.add(new BasicNameValuePair("pass", param));

try{

//将请求参数列表转化为请求实体元信息

HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");

//将请求实体元信息设置到请求中

request.setEntity(paramEntity);

//获取执行请求的HttpClient

HttpClient client = new DefaultHttpClient(connParams);

//执行请求,获取响应

HttpResponse response = client.execute(request);

//判断是否正确响应

if(response.getStatusLine().getStatusCode() == 200){

//获取响应内容

HttpEntity entity = response.getEntity();

if(entity!=null){

content = EntityUtils.toString(entity, "utf-8");

Log.d("TAG", "content: " + content);

content = parseJson(content).toString();

}else{

content = "服务器没有给出响应内容";

}

}else{

content = "获取响应失败!";

}

}catch(SocketTimeoutException e){

Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();

}catch(IOException e){

e.printStackTrace();

Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();

}

return content;

}

如何避免ANR:

Thread + Handler

AsyncTask

关于Handler:

http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html

http://blog.csdn.net/cugbabybear/article/details/8805159

http://blog.sina.com.cn/s/blog_6ee33f040101d7bx.html

关于AsyncTask:

AsyncTask:异步任务类<----------------------->handler

//如果我有耗时工作,并且耗时工作结束之后要更新UI

异步任务的泛型类型

AsynTask<参数,进度条参数,返回值>

启动异步任务类:  调用  execute(参数); //不定长参数

当调用execute的时候执行 doInBackground(参数)。

doInBackground方法在子线程执行,当其执行完毕后返回返回值,

然后执行onPostExe

扩展: 网络通信的中文乱码问题

网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。

一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成

Unicode字符集了。

另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:

使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组

再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码

作业描述:

访问服务器文件内容并通过TextView将内容显示出来

要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范

2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范

时间: 2024-10-10 15:15:21

网络编程:Http通信与Socket通信的相关文章

Java基础知识强化之网络编程笔记02:Socket通信原理图解

1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网络通信其实就是Socket间的通信.  • 数据在两个Socket间通过IO传输. 2.  Socket通信原理图解:

第1章 网络编程基础(3)——基本Socket通信

服务器常用模型 (1)初始化监听Socket 初始化Socket SOCKET s; s = socket(AF_INET,SOCKET_STREAM,IPPROTO_TCP); //创建一个Socket作为监听端口 //Socket种类为流Socket //使用的网络协议为TCP协议 //Socket家族取值为AF_INET 绑定Socket SOCKETADDR_IN addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_a

Android网络编程(一)---Socket基础

Socket通常称为""套接字.Socket字面上的中文意思为"插座".一台服务器可能会提供很多服务,每种服务对应一个Socket,而客户的"插头"也是一个Socket.Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.Socket用于描述IP地址和端口,是一个通信链的句柄.应

嵌入式 Linux网络编程(一)——Socket网络编程基础

嵌入式 Linux网络编程一--Socket网络编程基础 一.Socket简介 1.网络中进程间通信 本机进程使用进程号区别不同的进程进程间通信方式有管道.信号.消息队列.共享内存.信号量等.网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别. 2.Socket原理 Socket是应用层与TCP/IP协议族通信的中间软件抽象层是一种编程接口.Socket屏蔽了不同网络协议的差异支持面向连接(Transmission Cont

网络编程 套接字socket 及 粘包

网络编程 套接字socket 及 粘包 sockt 初识 五层协议 : 从传输层包括传输层以下 , 都是操作系统帮我们封装的各种head socket套接字充当的就是内置模块的角色 socket 套接字,它存在于传输层与应用层之间的抽象层 避免你学习各层的接口以及协议的使用, socket已经封装好了所有的接口 . 直接使用这些接口或者方法即可 , 使用起来方便,提升开发效率 socket 就是一个模块 , 通过使用学习模块提供的功能 , 建立客户端与服务端的通信 套接字的工作流程(基于TCP和

C#通信之Socket通信的简单例子

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 这里构建一个简单的例子,客户端发消息,服务端接收,然后回执一条消息.大致能够了解如何使用Socket进行通信. 服务端监听,接收信息: 客户端连接,并发送信息: 使用Socket通信,程序一般会在幕后运行,然后再合适的时间提示信息.这很自然的就会涉及到多线程的问题.在这个例子中因为每个连接都要创建一 个线程,所以需要对线程进行管理.这里我使用了两个类:Conn

Java网络编程(ServerSocket和Socket)

服务器端 package org.tcp; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class HelloServer { public static void main(String[] args) throws Exception{ ServerSocket server = null; Socket client = null; PrintStream

网络编程socket-采用TCP协议通信

本人最近做毕设期间设计到采用TCP协议通信网络编程,就随便做了个简单通信项目.大概内容:用户端输入用户名和密码,通过socket把传给服务器,经过服务器判断后,再把“用户是否登录成功”的信息传给用户端. 运行示例(codeblocks): 分别编译用户端和服务器项目后,产生两个.exe,再分别运行,即可. 1.先运行server.exe 2.运行client.exe 3.在client.exe窗口输入用户名和密码. 示例 源代码:http://files.cnblogs.com/files/Xb

C#网络编程系列(两)它Socket同步TCPserver

声明原文 笔者:竹zz  本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程系列文章(一)之Socket实现异步TCPserver C#网络编程系列文章(二)之Socket实现同步TCPserver C#网络编程系列文章(三)之TcpListener实现异步TCPserver C#网络编程系列文章(四)之TcpListener实现同步TCPserver C#网络编程系列文章(五)