`
smz11smz
  • 浏览: 16548 次
社区版块
存档分类
最新评论

应用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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics