运行服务器后,在运行客户端,
服务器就挂了,
然后客户端一直循环显示
客户端可读...
客户端可写...
客户端可读...
客户端可写...
客户端可读...
客户端可写...
服务器端显示
Serve 启动了!
服务器端接收到连接...
Exception in thread "main" 客户端信息/192.168.1.76:4634
java.nio.channels.IllegalBlockingModeException
at java.nio.channels.spi.AbstractSelectableChannel.register(Unknown Source)
at nonblock.MyServer.server(MyServer.java:40)
at nonblock.MyServer.main(MyServer.java:55)
请问这是怎么回事啊?
谢谢了啊
这个是服务器端的代码
[code="java"]package nonblock;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.net.*;
import java.util.*;
public class MyServer {
private ServerSocketChannel ssc ;
private Selector selector ;
private int port = 8000;
private Charset charset ;
public MyServer() throws IOException{
selector = Selector.open();
ssc = ServerSocketChannel.open();
ssc.socket().setReuseAddress(true);
ssc.configureBlocking(false);
ssc.socket().bind(new InetSocketAddress(port));
System.out.println("Serve 启动了!");
}
public void server() throws IOException{
ssc.register(selector, SelectionKey.OP_ACCEPT);
while(selector.select()>0){
Set keySet = selector.selectedKeys();
Iterator iter = keySet.iterator();
while(iter.hasNext()){
SelectionKey key = (SelectionKey)iter.next();
//一定要remove,否则会一直存在
iter.remove();
if(key.isAcceptable()){
ServerSocketChannel s = (ServerSocketChannel)key.channel();
SocketChannel sc = (SocketChannel)s.accept();
System.out.println("服务器端接收到连接...");
System.out.println("客户端信息"+sc.socket().getLocalAddress()+":"+sc.socket().getPort());
ByteBuffer buffer = ByteBuffer.allocate(1024);
sc.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE, buffer);
System.out.println("服务器完成注册...");
}
if(key.isReadable()){
System.out.println("服务器端可以读取信息...");
}
if(key.isWritable()){
System.out.println("服务器端可以写入信息...");
}
}
}
}
public static void main(String[] arg){
try {
new MyServer().server();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/code]
这个是客户端的代码
[code="java"]package nonblock;
import java.net.*;
import java.nio.channels.*;
import java.nio.*;
import java.io.*;
import java.nio.charset.*;
import java.util.*;
public class MyClient {
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 MyClient() throws IOException {
socketChannel = SocketChannel.open();
InetAddress ia = InetAddress.getLocalHost();
InetSocketAddress isa = new InetSocketAddress(ia, 7676);
socketChannel.connect(isa);
socketChannel.configureBlocking(false);
System.out.println("与服务器的连接建立成功");
selector = Selector.open();
}
public static void main(String args[]) throws IOException {
final MyClient client = new MyClient();
// Thread receiver = new Thread() {
// public void run() {
// client.receiveFromUser();
// }
// };
//
// receiver.start();
client.talk();
}
private void talk() throws IOException {
// TODO Auto-generated method stub
socketChannel.register(selector, SelectionKey.OP_READ
| SelectionKey.OP_WRITE);
while(selector.select()>0){
Set keySet = selector.selectedKeys();
Iterator iter = keySet.iterator();
while(iter.hasNext()){
SelectionKey key = (SelectionKey)iter.next();
iter.remove();
if(key.isReadable()){
System.out.println("客户端可读...");
}
if(key.isWritable()){
System.out.println("客户端可写...");
}
}
}
}
}
[/code]