Windows 下单机最大TCP连接数 - eaglet - 博客园
在做Socket 编程时,我们经常会要问,单机最多可以建立多少个 TCP 连接,本文将介绍如何调整系统参数来调整单机的最大TCP连接数。
Windows 下单机的TCP连接数有多个参数共同决定,下面一一介绍:
最大TCP连接数
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
TcpNumConnections = 0x00fffffe (Default = 16,777,214)
以上注册表信息配置单机的最大允许的TCP连接数,默认为 16M。这个数值看似很大,这个并不是限制最大连接数的唯一条件,还有其他条件会限制到TCP 连接的最大连接数。
最大动态端口数
TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 个Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)
最大TCB 数量
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。
系统的最大TCB数量由如下注册表设置决定
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)
Server 版本,这个的默认值为 2000。
也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。
最大TCB Hash table 数量
TCB 是通过Hash table 来管理的,下面注册表设置决定了这个Hash table 的大小
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters]
MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB
那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.
IBM WebSphere Voice Server 在windows server 2003 下的典型配置
这是IBM WebSphere Voice Server 的典型配置,大家可以做个参考。原文参见
IBM Web Sphere Voice Server 配置
- MaxUserPort = 65534 (Decimal)
- MaxHashTableSize = 65536 (Decimal)
- MaxFreeTcbs = 16000 (Decimal)
这里我们可以看到 MaxHashTableSize 被配置为比MaxFreeTcbs 大4倍,这样可以大大增加TCP建立的速度。
各种高并发系统的Windows服务器必须要的配置,如Apache http Server、Tomcat、Weblogi、Nginxc等
java opc jeasyopc-永不退缩-我的搜狐
关于jeasyopc的详细资料可以到https://sourceforge.net/projects/jeasyopc 上去看看。
有了jeasyopc,一切操作都简单的很,如下:
//第一步,初始化
//第二步,建立一个JOpc对象,三个参数,分别是OpcServer的IP,Server的name,还有JOpc的name
JOpc jopc = new JOpc("172.29.10.173", "Matrikon.OPC.Simulation.1", "JOPC1");
//第三步,建立连接
jopc.connect();
//第四步,新建一个OPC的group和item,并把item加到group中
OpcGroup group = new OpcGroup("TestGroup", true, 500, 0.0f);
OpcItem item = new OpcItem("Bucket Brigade.Int1", true, "");
group.addItem(item);
//第五步,注册group,item
jopc.addGroup(group);
jopc.registerGroup(group);
jopc.registerItem(group, item);
//第六步赋值,并同步至服务器
item.setValue(new Variant(1));
jopc.synchWriteItem(group, item);
//最后,该释放的全释放掉
jopc.unregisterItem(group, item);
jopc.unregisterGroup(group);
JOpc.coUninitialize();
apache/php 性能大幅提升关键参数 - 没有开花的树 - 博客频道 - CSDN.NET
apache/php 提升性能关键参数
参数1:Apache KeepAlive
Apache KeepAlive需要和线程绑定,服务器繁忙时会耗光所有线程
- KeepAlive Off
参数2:Apache MPM
Apache MPM可以通过优化apache内部进程的调度来提高apache的处理能力,这里为windows参数(其他系统没测试,不提供参考,具体看官方文档)
- <IfModule mpm_winnt.c>
- #Win32DisableAcceptEx
- ThreadsPerChild 1000
- MaxRequestsPerChild 10000
- </IfModule>
参数Win32DisableAcceptEx会降低性能,但如果服务器网络不稳定,Apache经常报这个错误“[warn] (OS 64)指定的网络名不再可用。 winnt_accept: Asynchronous AcceptEx failed.”,就得考虑使用
参数Win32DisableAcceptEx的使用也是有风险的,可能带来另外一个问题。ApacheBench测试时,容易出现以下错误:
apr_socket_recv: 远程主机强迫关闭了一个现有的连接。 (730054)
Total of 195 requests completed
Android 跨应用调用Activity及Service - 叶园 - 博客频道 - CSDN.NET
如何调用另外一个app应用的activity或者service,本文提供一个验证可行的方法。
调用方法:
- Intent intent=new Intent("youActionName");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.addCategory(Intent.CATEGORY_DEFAULT);
- intent.putExtra("type",inType); //if needed
- ComponentName cn=new ComponentName("applicationPackageName","packagename+classname");
- intent.setComponent(cn);
- startActivity(intent);
在被调用的App里面需要定义 class (activity 或 service)属性和filter。需要明确的几点
如果不是action.Main,则需要主动申明Android:exported="true",允许外部访问
action name 要一致
category name要一致,如果调用的地方没有明确声明,被调用的地方要声明DEFAULT
- <activity android:name=".pbap.BluetoothPbapLuancherActivity"
- android:label="Bluetooth"
- android:exported="true"
- android:process="@string/process">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
Android五种数据传递方法汇总 - 拙言的专栏 - 博客频道 - CSDN.NET
- //传递些简单的参数
- Intent intentSimple = new Intent();
- intentSimple.setClass(MainActivity.this,SimpleActivity.class);
- Bundle bundleSimple = new Bundle();
- bundleSimple.putString("usr", "xcl");
- bundleSimple.putString("pwd", "zj");
- intentSimple.putExtras(bundleSimple);
- startActivity(intentSimple);
- //接收参数
- Bundle bunde = this.getIntent().getExtras();
- String eml = bunde.getString("usr");
- String pwd = bunde.getString("pwd");
在 12306.cn 或电话订火车票有哪些实用小技巧? - 知乎
1、一定确定好是车次优先,还是席别优先,还是时间优先。千万不要想着有好多趟车可以选择,一定要直指目标。买票时不容多次尝试
2、要尤其注意区间。为什么呢?因为始发站、大站的会预留更多车票,而铁路是支持异地上车的。
比如苏州-成都的卧铺巨难买,原来苏州基本都是过路车,始发站是上海,所以直接买从上海-成都的票,然后在苏州上车。同理,如果买到苏州-成都的票,也可以从上海上车,上车后补上海-苏州的票价。
3、开始买票。12306账号、提前编辑联系人之类的不多说。金山和某数字公司打得热火朝天了,但是12306改验证码之后,还是捉急。碰上能打开,果断刷之;打不开,果断放弃另用他法。
4、手机千万不能放过,可以用火车票达人。平时买票够用了,前阵12306改版导致一时瘫痪,但是及时修复的诚意和客服还是很靠谱。春运期间,两套账号登录大有妙用,可以增加成功率。
买票时12306账号登录,直接下订单抢票;同时也要用达人账号下代购单,让达人的代购也帮着刷票。理由很简单,加上机器一起刷单,肯定比自己一个人容易买到。
如果自己成功买到票,代购就没法购买同一天同一车次,会直接退款;同样,如果代购成功买到该趟车次,自己也不用买;如果自己买到其他车次/日期的满意的票,可以直接取消代购订单,退款。
5、电话订票也不要放弃。很多人都到网上扎堆,春运期间电话订票也是不能放弃的方法。电话订票一定一定一定要注意!!!在正式订票之前,要拨打几次电话,搞清楚订票的流程,不同地方的订票电话语音导航是不一样的,网上看到的未必适合你。有的要地方先输验证码,有的地方需要输入乘车城市和到达城市的区号,有的地方输入区号之后,还要选择车站。。。。这些流程一定要准备充分,提前记下来,电话订票的时候,在第一时间输进去编号,不要等语音提示都讲完再输入。
注意!电话订票的取票时间里也有信息,当日已订车票前已订车票于第二日12:00前取有效,那就是说,12点以后没有取的票,就会回炉重售了!
6、 没有办法中的办法。发车时间(注意是发车,不是该车站起售时间)之前的24小时,会有少量机动票放出,这就是为什么有些人在眼看明天就要吃团年饭了,还能买到票回家的原因。风险大,须谨慎。
7、除了公开发售的车票,通常列车有一节车厢供乘务员休息,当工作人员用不到全部的席位,剩下的卧铺会作为机动票,可以补给乘客。如果没有买到卧铺,上车的时候一定想办法提前检票,检票之后第一时间问补票。
【卜維丰】用 CSS3 美化表單分組(fieldset)
fieldset { |
02 |
border:0; |
03 |
padding:10px; |
04 |
margin-bottom: |
05 |
10px;background:#EEE; |
06 |
07 |
border-radius: 8px; |
08 |
-moz-border-radius: 8px; |
09 |
-webkit-border-radius: 8px; |
10 |
11 |
background:-webkit-liner-gradient(top,#EEEEEE,#FFFFFF); |
12 |
background:linear-gradient(top,#EFEFEF,#FFFFFF); |
13 |
14 |
box-shadow:3px 3px 10px #666; |
15 |
-moz-box-shadow:3px 3px 10px #666; |
16 |
-webkit-box-shadow:3px 3px 10px #666; |
17 |
18 |
position:relative; |
19 |
} |
20 |
21 |
legend { |
22 |
padding:5px 10px; |
23 |
background-color:#4F709F; |
24 |
color:#FFF; |
25 |
26 |
border-radius:3px; |
27 |
-moz-border-radius:3px; |
28 |
-webkit-border-radius:3px; |
29 |
30 |
box-shadow:2px 2px 4px #666; |
31 |
-moz-box-shadow:2px 2px 4px #666; |
32 |
-webkit-box-shadow:2px 2px 4px #666; |
33 |
34 |
position:absolute; |
35 |
left:10px;top:-11px; |
36 |
} |
spring + XFire 构建webservic 客户端根据服务地址创建客户端调用 - yanwenhan - ITeye技术网站
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="baseService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean" lazy-init="false" abstract="true">
- <property name="lookupServiceOnStartup" value="false" />
- </bean>
- <bean id="echoService" parent="baseService">
- <property name="serviceClass">
- <value>com.hyw.example.Echo</value>
- </property>
- <property name="wsdlDocumentUrl">
- <value>http://localhost:8080/MyWebService/EchoService?wsdl</value>
- </property>
- </bean>
- <bean id="userService" parent="baseService">
- <property name="serviceClass">
- <value>com.hyw.example.UserService</value>
- </property>
- <property name="wsdlDocumentUrl">
- <value>http://localhost:8080/MyWebService/UserService?wsdl</value>
- </property>
- </bean>
- </beans>
多个dwr.xml文件的配置 - imticg - ITeye技术网站
多个dwr.xml文件的配置分为如下的几种情况:
一个servlet对多个dwr.xml文件
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
在这种配置下,param-name的值必须以config开头。
多个servlet对多个dwr.xml文件的情况
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
在这种情况下,我们可以根据J2EE security来控制权限,针对不同url,加不同的角色
Birt调用存储过程总结 - 王显锋的日志 - 网易博客
1. 调用类似
PROCEDURE test_birt_stored_pkg.get_user_info(p_recordset OUT record_set);
record_set 被定义为cursor,如:type record_set is ref cursor;首先定义jdbc数据源,如图:
然后定义存储过程类型的数据集:在选择数据集类型的时候选择Sql stored procedure query,
下一步,选择所要调用的存储过程,选择存储过程的时候要注意格式:
{call 模式名.包名.过程名(arg1,arg2, ...)}
一定要有模式名,否则birt不能够自动探测到参数的个数和类型。
点击finish,birt会自动探测所有的输出列,并显示出来,并且可以对列进行编辑。
birt会自动检测参数个数和类型,并自动生成所有的参数:
定义参数的时候需要注意,所有参数可以用?占位符代替,比如调用类似如下过程的时候:
PROCEDURE get_user_info(p_emp_number in varchar2,
p_errcode out varchar2,
p_errmsg out varchar2,
p_recordset OUT record_set);
调用语句类似:
{callamstest.test_birt_stored_procedure.get_user_info(?,?,?,?)},然后birt可以自动生成对应的参数:
这时候提示输入参数应该有一个非空的默认值,双击对其进行编辑,然后可以关联到报表参数或者其他类型的参数。
然后ok,这样就可以对相应的列进行操作:
Spring JdbcTemplate方法详解 - - 博客频道 - CSDN.NET
- //1.查询一行数据并返回int型结果
- jdbcTemplate.queryForInt("select count(*) from test");
- //2. 查询一行数据并将该行数据转换为Map返回
- jdbcTemplate.queryForMap("select * from test where name='name5'");
- //3.查询一行任何类型的数据,最后一个参数指定返回结果类型
- jdbcTemplate.queryForObject("select count(*) from test", Integer.class);
- //4.查询一批数据,默认将每行数据转换为Map
- jdbcTemplate.queryForList("select * from test");
- //5.只查询一列数据列表,列类型是String类型,列名字是name
- jdbcTemplate.queryForList("
- select name from test where name=?", new Object[]{"name5"}, String.class);
- //6.查询一批数据,返回为SqlRowSet,类似于ResultSet,但不再绑定到连接上
- SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from test");
HtmlUnit - Welcome to HtmlUnit
Features
- Support for the HTTP and HTTPS protocols
- Support for cookies
- Ability to specify whether failing responses from the server should throw exceptions or should be returned as pages of the appropriate type (based on content type)
- Support for submit methods POST and GET (as well as HEAD, DELETE, ...)
- Ability to customize the request headers being sent to the server
- Support for HTML responses
- Wrapper for HTML pages that provides easy access to all information contained inside them
- Support for submitting forms
- Support for clicking links
- Support for walking the DOM model of the HTML document
- Proxy server support
- Support for basic and NTLM authentication
- Excellent JavaScript support (see the JavaScript section below)
JavaScript Support
HtmlUnit provides excellent JavaScript support, simulating the behavior of the configured browser (Firefox or Internet Explorer). It uses the Rhino JavaScript engine for the core language (plus workarounds for some Rhino bugs) and provides the implementation for the objects specific to execution in a browser.
The unit tests of some well-known JavaScript libraries are included in HtmlUnit's own unit tests; based on these unit tests, the following libraries are known to work well with HtmlUnit:
- jQuery 1.2.6: Full support (see unit test here)
- MochiKit 1.4.1: Full support (see unit tests here)
- GWT 2.5.0: Full support (see unit test here)
- Sarissa 0.9.9.3: Full support (see unit test here)
- MooTools 1.2.1: Full support (see unit test here)
- Prototype 1.6.0: Very good support (see unit test here)
- Ext JS 2.2: Very good support (see unit test here)
- Dojo 1.0.2: Good support (see unit test here)
- YUI 2.3.0: Good support (see unit test here)
To disable JavaScript processing for one WebClient, call WebClient.setJavaScriptEnabled(false).
JavaScript code is executed just like in normal browsers when the page loads or when an handler is triggered. Additionally HtmlUnit provides the ability to inject code into an existing page via HtmlPage.executeJavascript(String yourJsCode).







