应用mina的例子做了一些修改,但有关于连接数的问题

刚用了一下mina 2.0RC 在网上找了一个例子做测试
因为是做连接数测试,所以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());
}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值