NIO问题!!请各位大侠帮忙解决下性能问题
[color=#FF0000]我写了个简单的demo但是当客户端连接到服务时cup就上涨到50%了。[/color]
Server类:
public class ServerSocket {
Selector selector = null;
ServerSocketChannel ssc = null;
private Charset charset = Charset.forName( "GBK ");
public static void main(String[] args) {
ServerSocket server=new ServerSocket();
try {
server.server();
} catch (IOException e) {
e.printStackTrace();
}
}
public ServerSocket() {
try {
ssc = ServerSocketChannel.open();
java.net.ServerSocket serversocket = ssc.socket();
serversocket.setReuseAddress(true);
serversocket.bind(new InetSocketAddress( "192.168.0.159 ", 9999));
ssc.configureBlocking(false);
selector = Selector.open();
} catch (IOException e) {
e.printStackTrace();
}
}
public void server() throws IOException {
ssc.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select()> 0) {
Set <SelectionKey> seletorKey = selector.selectedKeys();
Iterator <SelectionKey> it = seletorKey.iterator();
while (it.hasNext()) {
SelectionKey key = null;
try {
key = it.next();
it.remove();
if (key.isAcceptable()) {
ServerSocketChannel ss = (ServerSocketChannel)
key.channel();
SocketChannel socketChannel = ss.accept();
socketChannel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
socketChannel.register(selector, SelectionKey.OP_READ
| SelectionKey.OP_WRITE, buffer);
}
if (key.isReadable()) {
//receive(key);
}
if (key.isWritable()) {
//send(key);
}
} catch (Exception e) {
if (key != null) {
key.cancel();
key.channel().close();
}
}
}
}
}
public static void main(String[] args) {
ServerSocket server=new ServerSocket();
try {
server.server();
} catch (IOException e) {
e.printStackTrace();
}
}
}
client类:
public class SocketClient {
private SocketChannel socketChannel = null;
private ByteBuffer sendBuffer = ByteBuffer.allocate(1024);
private ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
private Charset charset = Charset.forName( "GBK ");
private Selector selector;
public SocketClient() throws IOException {
socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress( "192.168.0.159 ", 9020));
socketChannel.configureBlocking(false);
System.out.println( "与服务器的连接建立成功 ");
selector = Selector.open();
}
public void server() throws IOException {
socketChannel.register(selector, SelectionKey.OP_READ
| SelectionKey.OP_WRITE);
while (selector.select() > 0) {
Set <SelectionKey> readyKey = selector.selectedKeys();
Iterator <SelectionKey> it = readyKey.iterator();
while (it.hasNext()) {
SelectionKey key = null;
try {
key = it.next();
it.remove();
if (key.isReadable()) {
//receive(key);
}
if (key.isWritable()) {
//send(key);
}
} catch (Exception e) {
if (key != null) {
key.cancel();
key.channel().close();
}
}
}
}
}
public static void main(String[] args) throws IOException {
SocketClient client = new SocketClient();
client.server();
}
}
[解决办法]
不懂!帮顶
[解决办法]
不要接收到连接就注册SelectionKey.OP_WRITE事件,那个事件基本上管道不堵塞一直就绪的。
先只注册可读事件。
socketChannel.register(selector, SelectionKey.OP_READ,buffer);
[解决办法]
楼上正解!
[解决办法]
数据写完后,记得将写事件取消掉。
key.interestOps(SelectionKey.OP_READ);
[解决办法]
有点要注意一下,关于同步的问题。
定义一个同步变量。
final Object synchronizedObj = new Object();
[解决办法]
if (key.isReadable()) {
//receive(key); 你要不读取的话, 会一直有读取事件。 死循环。
}
ByteBuffer buffer = ByteBuffer.allocate(1024); 这据代码, 在循环里面, 是会要你命的哦。