package com.trydone.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;
public class TestServer {
private static final String MSG = "返回 输出消息 \n";
private static int count = 0;
private static int current = 0;
public static void main(String[] args) throws Exception {
boolean runWait = args != null && args.length > 0;
// runWait=true;
int port = 8989;
ServerSocketChannel ssc = ServerSocketChannel.open();
System.out.println("服务器启动:" + port + (runWait ? " 模拟1秒等待" : ""));
if (args != null)
System.out.println("arguments:" + Arrays.toString(args));
ServerSocket ss = ssc.socket();
ss.bind(new InetSocketAddress(port));
// set no blocking
ssc.configureBlocking(false);
while (true) {
try {
while (current>100) {
synchronized (Thread.currentThread()) {
Thread.currentThread().wait(1);
}
}
SocketChannel sc = ssc.accept();
if (sc == null) {
synchronized (Thread.currentThread()) {
Thread.currentThread().wait(1);
}
} else {
count++;
if (!runWait) {
current++;
processBackRun(sc); //不限制
current--;
} else {
processBack(sc);//限制线程1秒后台开新线程处理
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
private static void processBack(final SocketChannel sc) {
new Thread(new Runnable() {
@Override
public void run() {
try {
current++;
Thread.sleep(1000);//等1秒,测试 1秒并发连接 数用
processBackRun(sc);
} catch (Throwable e) {
e.printStackTrace();
} finally {
current--;
}
}
}).start();
}
private static void processBackRun(SocketChannel sc) throws InterruptedException, IOException {
// current++;
System.out.println("来自:" + sc.socket().getRemoteSocketAddress() + " 连接,总" + count + "个连接,当前连接 " + current + "个");
ByteBuffer readerBuffer = ByteBuffer.allocate(1024);
sc.read(readerBuffer);
readerBuffer.flip();
//output get
ByteBuffer buffer = ByteBuffer.wrap(MSG.getBytes());
if(out(readerBuffer)){
buffer= ByteBuffer.wrap(("总" + count + "个连接,当前连接 " + current + "个").getBytes());
}
buffer.rewind();
sc.write(buffer);
sc.close();
// current--;
}
private static boolean out(ByteBuffer readerBuffer) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < readerBuffer.limit(); i++) {
char c = (char) readerBuffer.get();
sb.append(new String(new char[]{c}));
}
if(sb.toString().equals("status")){
return true;
}else
System.out.println(sb.toString());
return false;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
niotest.rar (2个子文件)
TestServer.java 4KB
TestClient.java 3KB
共 2 条
- 1
资源评论
xxxppk
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功