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七层模型
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通信 (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:
关于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七层模型
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通信 (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:
关于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优化性能,要求必须设置超时连接参数,注意编码规范
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
1. Socket (1)Socket套接字 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制: • 通信两端都有Socket. • 网 ...
- 第1章 网络编程基础(3)——基本Socket通信
服务器常用模型
- Socket网络编程(3)--两端通信
上篇博文:http://www.cnblogs.com/wolf-sun/p/3329558.html 介绍了客户端连接服务端,一对一,多对一的情况,下面实现服务器接收消息的功能.LZ这些弄的比较慢, ...
- C#网络编程系列(两)它Socket同步TCPserver
声明原文 笔者:竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程系列文 ...
- Python网络编程(1)-socket
我会在近期尽快更新好之前写的博客,会添加新的知识点和注意问题,排版和内容都会较之前有很大的改观,感谢大家一直的支持! 1. 客户端/服务器架构 客户端/服务器架构也称主从式架构,简称C/S架构,它是一 ...
- 网络编程学习笔记:Socket编程
文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- Java网络编程(一)Socket套接字
一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
随机推荐
- Java集合---ArrayList的实现原理
目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 6) 调整数组容量 ...
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
- ARM9代码分析启动MAIN.C
#define GLOBAL_CLK 1 #include <stdlib.h> #include <string.h> #include “def.h” #include “ ...
- 【C解毒】滥用变量
见:[C解毒]滥用变量
- phpcms V9 数据模型基类
在学习<phpcms V9首页模板文件解析>的第七步,我们看到content_model类,文件路径:phpcms/model/content_model.class.php 从代码中,可 ...
- each(callback) 对于每个匹配的元素所要执行的函数
以每一个匹配的元素作为上下文来执行一个函数. 意味着,每次执行传递进来的函数时,函数中的this关键字都指向一个不同的DOM元素(每次都是一个不同的匹配元素).而且,在每次执行函数时,都会给函数传递一 ...
- svn使用方法介绍(1)
TotoiseSVN的基本使用方法 在 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]中,我已经讲解了怎样安装TortoiseSVN.在上面的讲解中已经讲了怎么使用VisualS ...
- Linux 奇技淫巧
为了整理这些命令,花了我一个晚上的时间,但是不弄明白,我就是不爽啊. 1.cmatrix 命令 黑客帝国,就是酷炫,先按F11全屏效果更佳 安装:luffy@ubuntu:~$ sudo apt-ge ...
- HTML5视频播放在ios下浮动元素无法点击的解决方案
最近许多人在微博上问到在iPad.iPhone.iTouch等设备上使用HTML5播放视频,在视频上方悬浮一个div元素,div内的元素无法点击的情况,而在PC浏览器上没有这个问题. 这个现象是设备特 ...
- 2016年12月25日 星期日 --出埃及记 Exodus 21:20
2016年12月25日 星期日 --出埃及记 Exodus 21:20 "If a man beats his male or female slave with a rod and the ...