应用mina的例子做了一些修改,但有关于连接数的问题
来源:互联网 发布:java分布式系统有哪些 编辑:程序博客网 时间:2024/05/22 04:31
因为是做连接数测试,所以client中,用for循环5W次。但运行了很多次,没一次超过4000个连接的。
第1次:3955个连接
第2次:3944个连接
第3次:3955个连接
第4次:3936个连接
第5次:3955个连接
第6次:3954个连接
第7次:3956个连接
运行完后隔个10多20秒就会出这个错
No buffer space available(maximum connections reaceed?) :connect
并且在不关程序的状态下,都是不能再新建连接打开网页的,IE会出错
您指定的网页无法访问!
错误类型:连接失败
以为是操作系统连接数有限制,用EvID4226Patch修改连接数为1W了,用sp2tcppatch查看系统的连接数为无限制,重启后还是不过4000!!! 我想尽可能多的让一个端口并发更多的连接,最好能并发到1W个连接。如何处理呢。还有,现在这个测试程序只是测试连接,server和client之间根本没什么数据传输,要是再24小时不停传输数据的话,连接数不是要更少????
为方便大家看。修改后code如下,每个类都是非常简洁,请大家耐心看完
~~~~~~~~~~~~~~~~~~client端~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MainClient
{
public static void main(String[] args) throws Exception
{
// 创建IO连接器
NioSocketConnector connector = new NioSocketConnector();
// 创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的读取数据
chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory()));
chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
//设定服务器端的消息处理器:一个 SamplMinaServerHandler 对象,
connector.setHandler(new SamplMinaClientHandler());
// Set connect timeout.
connector.setConnectTimeoutMillis(3000);
//连结到服务器:
ConnectFuture cf=null;
for(int i=1;i<50000;i++)
{ //连接服务器
cf = connector.connect(new InetSocketAddress("localhost", 3333));
//等待异步执行的结果返回
cf.awaitUninterruptibly();
}
//等待连接断开
cf.getSession().getCloseFuture().awaitUninterruptibly();
//停止客户端
connector.dispose();
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~clientHandler~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.service.IoHandlerAdapter;
public class SamplMinaClientHandler extends IoHandlerAdapter
{
public void messageSent(IoSession session, Object message)throws Exception
{
//发送信息成功之后调用,不能用于发信息
}
//当一个客户端连结进入时
public void sessionOpened(IoSession session) throws Exception
{ //向服务器发送一个空字符
session.write(" ");
}
//当一个客户端关闭时
public void sessionClosed(IoSession session)
{
System.out.println("one Clinet Disconnect !");
}
//当客户端发送的消息到达时:
public void messageReceived(IoSession session, Object message)throws Exception
{
//什么也不做
}
}
~~~~~~~~~~~~~~~~~~server端~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LogLevel;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MainServer
{
public static void main(String[] args) throws Exception
{
//创建一个非阻塞的Server端Socket,用NIO IO接受器
SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的读取数据
chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
acceptor.setHandler(new SamplMinaServerHandler());
// 服务器端绑定的端口
int bindPort=3333;
//绑定端口,启动服务器
acceptor.bind(new InetSocketAddress(bindPort));
System.out.println("Mina Server is Listing on:= " + bindPort);
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~serverHandler~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.service.IoHandlerAdapter;
public class SamplMinaServerHandler extends IoHandlerAdapter
{
int i=0;
//当一个客端端连结进入时
public void sessionOpened(IoSession session) throws Exception
{ //显示有多个少客户端连接过来
System.out.println(++i);
}
//当一个客户端关闭时
public void sessionClosed(IoSession session)
{
System.out.println("one Clinet Disconnect !");
}
//当客户端发送的消息到达时:
public void messageReceived(IoSession session, Object message)throws Exception
{}
}
-----------------------------------------------------------------
-----------------------------------------------------------------
在网上找到方法, 虽然出的问题和我的有一点差别,他的是JVM_Bind,我的是connection
但按他修改注册表的做了
http://www.360doc.com/content/09/1031/12/10610_8145493.shtml
1. 启动注册表编辑器。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
2. 新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以,如果是十六进制,是FFFE,因为4个F是65535嘛)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,不行可以用WINDOWS计算器,很方便,这个表示TIME_WAIT的秒数)
连接数可以飘到1.6W个,也算差不多了,不知还有没有方法再上一层楼。
---------------------------------------------------------
改了一下程序。当客户端和服务器建立连接后,每个客户端每隔10秒向服务器发送200个字符串
结果是服务器连接10000个客户端都不行,只能大约4500个。
有什么方法可以让服务器支持连接更多的客户端
以下是code
~~~~~~~~~~~~~~~~~~~~~~~~~~~MainClient~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
public class MainClient
{
public static void main(String[] args) throws Exception
{
// 创建IO连接器
NioSocketConnector connector = new NioSocketConnector();
// 创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的读取数据
chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory()));
chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
//设定服务器端的消息处理器:一个 SamplMinaServerHandler 对象,
connector.setHandler(new SamplMinaClientHandler());
// Set connect timeout.
connector.setConnectTimeoutMillis(3000);
//连结到服务器:
ConnectFuture cf=null;
for(int i=1;i<=0000;i++)
{
//连接服务器
cf = connector.connect(new InetSocketAddress("localhost", 3333));
//等待异步执行的结果返回
cf.awaitUninterruptibly();
}
//等待连接断开
cf.getSession().getCloseFuture().awaitUninterruptibly();
//停止客户端
connector.dispose();
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~SamplMinaClientHandler~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.service.IoHandlerAdapter;
public class SamplMinaClientHandler extends IoHandlerAdapter
{
public void messageSent(IoSession session, Object message)throws Exception
{
//发送信息成功之后调用,不能用于发信息
}
//当一个客户端连结进入时
public void sessionOpened(IoSession session) throws Exception
{ //向服务器定时10秒发送一个200单位长度的字符串
while(true)
{
session.write("aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa" +
"aaaaaaaaaa");
Thread.sleep(10000);
}
}
//当一个客户端关闭时
public void sessionClosed(IoSession session)
{
System.out.println("one Clinet Disconnect !");
}
//当客户端发送的消息到达时:
public void messageReceived(IoSession session, Object message)throws Exception
{
//什么也不做
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~MainServer~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LogLevel;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MainServer
{
public static void main(String[] args) throws Exception
{
//创建一个非阻塞的Server端Socket,用NIO IO接受器
SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的读取数据
chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
acceptor.setHandler(new SamplMinaServerHandler());
// 服务器端绑定的端口
int bindPort=3333;
//绑定端口,启动服务器
acceptor.bind(new InetSocketAddress(bindPort));
System.out.println("Mina Server is Listing on:= " + bindPort);
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~SamplMinaServerHandler~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.javake.mina.sampleserver;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.service.IoHandlerAdapter;
public class SamplMinaServerHandler extends IoHandlerAdapter
{
int i=0;
int j=0;
//当一个客端端连结进入时
public void sessionOpened(IoSession session) throws Exception
{ //显示有多个少客户端连接过来
System.out.println(++i);
}
//当一个客户端关闭时
public void sessionClosed(IoSession session)
{
System.out.println("Disconnect "+(++j));
}
//当客户端发送的消息到达时:
public void messageReceived(IoSession session, Object message)throws Exception
{
//System.out.println(message.toString().length());
}
}
- 应用mina的例子做了一些修改,但有关于连接数的问题
- 应用mina的例子做了一些修改,但有关于连接数的问题
- 有关做PM的一些问题
- 有关于做动作识别遇到的问题
- 有关Oracle最大连接数的问题
- Mina的大量连接问题
- 有关于数据类型的小例子
- 有关apache mina框架的编码问题
- 有关于oracle的问题!
- 有关于预处理的问题
- MySQL的连接数修改的问题
- html有关于文本的一些标记
- 有关于smartforms的一些要点
- 有关于C++ 0x的一些
- 有关于用户体验的一些总结
- 有关于一些常见的流用法
- 有关于XMPP协议的一些总结
- 有关于数组的一些操作
- JSP————标签小结
- WP SDK7.1中文版+SDK7.1.1更新包安装方法
- HDOJ 1022 Train Problem I
- Fedora x64 17连接wpa加密的无线路由器
- java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind
- 应用mina的例子做了一些修改,但有关于连接数的问题
- IOS5基础十八------storyboard(动态原型单元和静态单元)
- dom4j解析xml实例
- Linux性能监控(1)
- N queen
- 作业
- android listview 多次addHeaderView()异常解决方法!
- POJ 3211 Washing Clothes
- python 带default的switch