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()
请高手赐教
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()
请高手赐教
楼主【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 %
楼主加油
建议你使用 apahce 的 mina 框架 或者 一个中国人写的 cindy 框架。 都是不错的 nio 框架。