应用mina的例子做了一些修改,但有关于连接数的问题
应用mina的例子做了一些修改,但有关于连接数的问题
2010年10月14日
修改后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.DefaultIoFilterCh ainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCode cFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConn ector;
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等待异步执行的结果返回
cf.awaitUninterruptibly();
}
//等待连接断开
cf.getSession().getCloseFuture().awaitUninterrupti bly();
//停止客户端
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.DefaultIoFilterCh ainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCode cFactory;
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.NioSocketAcce ptor;
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_814 5493.shtml
1. 启动注册表编辑器。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es\Tcpip\Parameters
2. 新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以,如果是十六进制,是FFFE,因为4个F是65535嘛)
有效范围: 5000 - 65534 (十进制)
默认: 0x1388 5000 (十进制)
新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,不行可以用WINDOWS计算器,很方便,这个表示TIME_WAIT的秒数)
连接数可以飘到1.6W个,也算差不多了,不知还有没有方法再上一层楼。
问题二
通过Mina既可以传送字符串.又可以传输文件
可以自己定义一个协议啊,很简单的比如
数据包总长度+字符串字节长度+字符串+字节流长度+字节流数据
就可以啦,解析起来也很方便
http://mina.apache.org/tutorial-on-protocolcodecfi lter-for-mina-2x.html