当前位置:  编程技术>移动开发
本页文章导读:
    ▪tcp 连接的11类状态–转载        tcp 连接的11种状态–转载   一、Linux服务器上11种网络连接状态 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手 注:以下说明最.........
    ▪ Drawable运用入门        Drawable使用入门 一个让人赏心悦目的界面对软件来说非常重要,因此图形图像资源也显得非常重要。本讲就要谈一谈Android中处理图形图像的最重要的一个类Drawable。Drawable就是一个可以画的对.........
    ▪ uses-permission跟permission有什么区别       uses-permission和permission有什么区别   很多网友可能发现Eclipse的ADT插件添加权限时有4个选项,当然除了Group类外,一般我们使用uses-permission,到底和permission有什么不同呢? 其实在androidmanifest.xml.........

[1]tcp 连接的11类状态–转载
    来源: 互联网  发布时间: 2014-02-18
tcp 连接的11种状态–转载

 

一、Linux服务器上11种网络连接状态

图:TCP的状态机

通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手

注:以下说明最好能结合”图:TCP的状态机”来理解。

SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。

ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。

FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。

1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */

2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */

3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV  /* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */

4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。/* The socket has an established connection. 代表一个打开的连接,数据可以传送给用户 */

5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 */

6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */


7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */


 、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */

9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */

10)、CLOSING: 比较少见./* Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认 */


11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束./* The socket is not being used. 没有任何连接状态 */

TIME_WAIT状态的形成只发生在主动关闭连接的一方。

主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。

当然上述很多TCP状态在系统里都有对应的解释或设置,可见man tcp

二、关于长连接和短连接:

通俗点讲:短连接就是一次TCP请求得到结果后,连接马上结束.而长连接并不马上断开,而一直保持着,直到长连接TIMEOUT(具体程序都有相关参数说明).长连接可以避免不断的进行TCP三次握手和四次挥手.

长连接(keepalive)是需要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP连接状态是ESTABLISHED.目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的),ie6/7/8和firefox都默认用的是http 1.1版本了(如何查看当前浏览器用的是哪个版本,这里不再赘述)。Apache,java

一个应用至于到底是该使用短连接还是长连接,应该视具体情况而定。一般的应用应该使用长连接。

1、Linux的相关keepalive参数

a、 tcp_keepalive_time – INTEGER
How often TCP sends out keepalive messages when keepalive is enabled.
Default: 2hours.

b、 tcp_keepalive_probes – INTEGER
How many keepalive probes TCP sends out, until it decides that the
connection is broken. Default value: 9.

c、 tcp_keepalive_intvl – INTEGER
How frequently the probes are send out. Multiplied by
tcp_keepalive_probes it is time to kill not responding connection,
after probes started. Default value: 75sec i.e. connection
will be aborted after ~11 minutes of retries.

2、F5负载均衡上的相关参数说明

a、Keep Alive Interval

Specifies, when enabled, how frequently the system sends data over an idle TCP connection, to determine whether the connection is still valid.

Specify: Specifies the interval at which the system sends data over an idle connection, to determine whether the connection is still valid. The default is 1800 milliseconds.

b、Time Wait

Specifies the length of time that a TCP connection remains in the TIME-WAIT state before entering the CLOSED state.

Specify: Specifies the number of milliseconds that a TCP connection can remain in the TIME-WAIT state. The default is 2000.

c、Idle Timeout

Specifies the length of time that a connection is idle (has no traffic) before the connection is eligible for deletion.

Specify: Specifies a number of seconds that the TCP connection can remain idle before the system deletes it. The default is 300 seconds.

3、Apache的相关参数说明

以下是Apache/2.0.61版本的默认参数和说明

a、KeepAlive:

default On.Whether or not to allow persistent connections (more than

one request per connection). Set to “Off” to deactivate.

b、MaxKeepAliveRequests:

default 100.The maximum number of requests to allow

during a persistent connection. Set to 0 to allow an unlimited amount.

We recommend you leave this number high, for maximum performance.

c、KeepAliveTimeout:

default 15. Number of seconds to wait for the next request from the

same client on the same connection.

4、JAVA1.6的相关参数说明:

a、http.keepAlive=<boolean>
default: true

Indicates if keep alive (persistent) connections should be supported.

b、http.maxConnections=<int>
default: 5

Indicates the maximum number of connections per destination to be kept alive at any given time

 


    
[2] Drawable运用入门
    来源: 互联网  发布时间: 2014-02-18
Drawable使用入门
一个让人赏心悦目的界面对软件来说非常重要,因此图形图像资源也显得非常重要。本讲就要谈一谈Android中处理图形图像的最重要的一个类Drawable。Drawable就是一个可以画的对象的抽象(有点别扭,你凑合看吧),下面是它的继承关系,可以看到BitmapDrawable,AnimationDrawable等对象都是它的子类。

[/url]

最简单的使用Drawable资源的方法是,把图片放入Android工程的res\drawable目录下,编程环境会自动在R类里为此资源创建一个引用。你可以使用此引用访问该资源对象。譬如对应用程序的图标,在Java代码中可以用R.drawable.icon引用到它,在XML中可以用@drawable/icon引用到它。

那么如果图片资源不在项目中而是在SDCard中时如何使用呢,我们看一下下面的例子学习一下Drawable的使用,并且顺便学习一下Bitmap和BitmapFactory的使用。

1、创建项目 Lesson23_Drawable,主Acitivity的名字是 MainDrawable.java,拷贝a.jpg和b.jpg两个文件到sdcard中

[url=http://android.yaohuiji.com/wp-content/uploads/2010/08/file_exlorper.jpg]

2、res\main.xml的内容如下:


01.<?xml version="1.0" encoding="utf-8"?>

02.<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

03.<textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:textsize="20sp" android:text="Drawable的使用-设置壁纸">

04.<button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20sp" android:text="查看图片A" android:id="@+id/Button01">

05.</button>

06.<button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20sp" android:text="查看图片B" android:id="@+id/Button02">

07.</button>

08.<button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20sp" android:text="设置图片A为壁纸" android:id="@+id/Button03">

09.</button>

10.<button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20sp" android:text="设置图片B为壁纸" android:id="@+id/Button04">

11.</button>

12.<button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="20sp" android:text="恢复默认壁纸" android:id="@+id/Button05">

13.</button>

14.<imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ImageView01">

15.</imageview>

16.</textview></linearlayout>
复制代码3、MainDrawable.java的内容如下:


01.package android.basic.lesson23;

02.

03.import java.io.IOException;

04.

05.import android.app.Activity;

06.import android.graphics.BitmapFactory;

07.import android.graphics.drawable.Drawable;

08.import android.os.Bundle;

09.import android.view.View;

10.import android.view.View.OnClickListener;

11.import android.widget.Button;

12.import android.widget.ImageView;

13.

14.public class MainDrawable extends Activity {

15.        /** Called when the activity is first created. */

16.        @Override

17.        public void onCreate(Bundle savedInstanceState) {

18.                super.onCreate(savedInstanceState);

19.                setContentView(R.layout.main);

20.

21.                //定义UI组件

22.                Button b1 = (Button) findViewById(R.id.Button01);

23.                Button b2 = (Button) findViewById(R.id.Button02);

24.                Button b3 = (Button) findViewById(R.id.Button03);

25.                Button b4 = (Button) findViewById(R.id.Button04);

26.                Button b5 = (Button) findViewById(R.id.Button05);

27.                final ImageView iv= (ImageView)findViewById(R.id.ImageView01);

28.

29.                //定义按钮点击监听器

30.                OnClickListener ocl = new OnClickListener() {

31.

32.                        @Override

33.                        public void onClick(View v) {

34.

35.                                switch (v.getId()) {

36.                                case R.id.Button01:

37.                                        //给ImageView设置图片,从存储卡中获取图片为Drawable,然后把Drawable设置为ImageView的背景

38.                                        iv.setBackgroundDrawable(Drawable.createFromPath("/sdcard/a.jpg"));

39.                                        break;

40.                                case R.id.Button02:

41.                                        iv.setBackgroundDrawable(Drawable.createFromPath("/sdcard/b.jpg"));

42.                                        break;

43.                                case R.id.Button03:

44.                                        try {

45.                                                //Activity的父类ContextWrapper有这个setWallpaper方法,当然使用此方法需要有android.permission.SET_WALLPAPER权限

46.                                                setWallpaper(BitmapFactory.decodeFile("/sdcard/a.jpg"));

47.                                        } catch (IOException e1) {

48.                                                e1.printStackTrace();

49.                                        }

50.                                        break;

51.                                case R.id.Button04:

52.                                        try {

53.                                                setWallpaper(BitmapFactory.decodeFile("/sdcard/b.jpg"));

54.                                        } catch (IOException e1) {

55.                                                e1.printStackTrace();

56.                                        }

57.                                        break;

58.                                case R.id.Button05:

59.                                        try {

60.                                                //Activity的父类ContextWrapper有这个clearWallpaper方法,作用是恢复默认壁纸,当然使用此方法需要有android.permission.SET_WALLPAPER权限

61.                                                clearWallpaper();

62.                                        } catch (IOException e) {

63.                                                e.printStackTrace();

64.                                        }

65.                                        break;

66.                                }

67.

68.                        }

69.

70.                };

71.

72.                //给按钮们绑定点击监听器

73.                b1.setOnClickListener(ocl);

74.                b2.setOnClickListener(ocl);

75.                b3.setOnClickListener(ocl);

76.                b4.setOnClickListener(ocl);

77.                b5.setOnClickListener(ocl);

78.        }

79.

80.}
复制代码4、AndroidManifest.xml的内容如下(设置权限):


01.<?xml version="1.0" encoding="utf-8"?>

02.<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.basic.lesson23" android:versioncode="1" android:versionname="1.0">

03.    <application android:icon="@drawable/icon" android:label="@string/app_name">

04.        <activity android:label="@string/app_name" android:name=".MainDrawable">

05.            <intent -filter="">

06.                <action android:name="android.intent.action.MAIN">

07.                <category android:name="android.intent.category.LAUNCHER">

08.            </category></action></intent>

09.        </activity>

10.

11.    </application>

12.    <uses -sdk="" android:minsdkversion="8">

13.

14.<uses -permission="" android:name="android.permission.SET_WALLPAPER"></uses>

15.</uses></manifest> 
复制代码5、运行程序,查看结果:[/url]点击“查看图片A”按钮,ImageView载入图片A并显示出来[url=http://android.yaohuiji.com/wp-content/uploads/2010/08/image20.png]点击”设置图片B为壁纸”按钮,可以看到图片B已经成为桌面壁纸。 好了本讲就到这里。


 


    
[3] uses-permission跟permission有什么区别
    来源: 互联网  发布时间: 2014-02-18
uses-permission和permission有什么区别

 

很多网友可能发现Eclipse的ADT插件添加权限时有4个选项,当然除了Group类外,一般我们使用uses-permission,到底和permission有什么不同呢? 其实在androidmanifest.xml文件中,<uses-permission>是和<application>同级的节点,一般<uses-permission >是在</application>后面的。但<permission>就不痛了,是定义在<application>和</application>之间,和Activity、Service同级别的。这点Android123建议大家试一试,同时使用group的权限组可以大幅减少你同类型相似权限的声明。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android中实现为TextView添加多个可点击的文本 iis7站长之家
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3