public class ServerListner implements Runnable { /* 服务器监听端口号 */
private int port = 9100; /* 数据持久层实例 */
private DB db = new DB(); /* 发送短信 */
private SubmitMessage submit_message = new SubmitMessage(); /* 读取的数据 */
private ByteBuffer r_buff = null; /* 待写入的数据 */
private ByteBuffer w_buff = ByteBuffer.allocate(5024); private Selector s ; private int count = 0; /**
 * 构造函数初始化,启动线程服务
 */
public ServerListner() {
try {
s = Selector.open();
System.out.println("---------------------" + s);
// 生成一个侦听端
ServerSocketChannel ssc = ServerSocketChannel.open();
// 将侦听端设为异步方式
ssc.configureBlocking(false);
// 生成一个信号监视器 // 侦听端绑定到一个端口
ssc.socket().bind(new InetSocketAddress(port));
// 设置侦听端所选的异步信号OP_ACCEPT
// 用于套接字接受操作的操作集位
ssc.register(s, SelectionKey.OP_ACCEPT);
// 启动线程
new Thread(this).start();
} catch (Exception e) {
e.printStackTrace();
}
} /**
 * 实现线程接口的方法
 */
public void run() { while (true) {
try {
         while (true) {
try {
System.out.println("s.select()");
s.select();
} catch (Exception e) {
    e.printStackTrace();
    Thread.currentThread().interrupt();
    new ServerListner();
    continue;
}
  // 已更新其准备就绪操作集的键的数目,该数目可能为零
Set<SelectionKey> keys = s.selectedKeys();
                   
count = keys.size();// 获取活动连接的数目
                  System.out.println("count = " + count);
if (count == 0) {
    continue;// 如果连接数为0,则继续进行循环操作
}

Iterator<?> it = s.selectedKeys().iterator();
System.out.println(s.selectedKeys().size());
while (it.hasNext()) {
    SelectionKey key = (SelectionKey) it.next();
    if (key.isAcceptable()) {
// 侦听端信号触发
ServerSocketChannel server = (ServerSocketChannel) key .channel();
// 接受到此通道套接字的连接
SocketChannel sc = server.accept();
// 设置为非阻塞状态
sc.configureBlocking(false);
sc.register(s, SelectionKey.OP_READ);
} if (key.isReadable()) {
// 某socket可读信号 触发函数DealwithData();
DealwithData(key);
}
it.remove();
r_buff = null;
key.selector().wakeup();
System.out.println("=" + s.selectedKeys().size());
} }       } catch (Exception e) {
Thread.currentThread().interrupt();
new ServerListner();
e.printStackTrace();
}
}
} /**
 * 提取请求,分析请求数据
 * 
 * @param key
 * @throws IOException
 */
public void DealwithData(SelectionKey key) throws IOException {
// 由key获取指定socketchannel的引用
SocketChannel sc = (SocketChannel) key.channel();
// 读取数据到r_buff
StringBuffer client = new StringBuffer();
r_buff = ByteBuffer.allocate(1024);
while (sc.read(r_buff) > 10) {
byte request_info[] = r_buff.array();
for (int i = 0; i < request_info.length; i++) {
if (r_buff.array()[i] != 0) {
client.append((char) request_info[i]);
}
}
} r_buff.clear();
String clientMes = client.toString();
r_buff = null;
System.out.println("Client = " + clientMes); // 获取当前操作类型,并做相应处理
if (!clientMes.trim().equals("")) {
getCurrentStepThenDisposal(sc, clientMes);
         }
}
问题: 当终端自动关闭连接的时候就在也获取不到任何请求信息了
控制台不停的显示: 
count = 0
s.select()
请高手赐教

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【ruguosmen】截止到2008-07-18 11:27:55的历史汇总数据(不包括此帖):
    发帖的总数量:8                        发帖的总分数:375                      每贴平均分数:46                       
    回帖的总数量:12                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:5                        结贴的总分数:225                      
    无满意结贴数:1                        无满意结贴分:20                       
    未结的帖子数:3                        未结的总分数:150                      
    结贴的百分比:62.50 %               结分的百分比:60.00 %                  
    无满意结贴率:20.00 %               无满意结分率:8.89  %                  
    楼主加油
      

  2.   


     建议你使用 apahce 的 mina 框架  或者 一个中国人写的 cindy 框架。 都是不错的 nio 框架。