您的位置:首页 > 编程语言 > Java开发

java socket nio编程

2016-05-15 23:49 519 查看
上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下...

public class TimeServer {

public static void main(String[] args) {
MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400);
new Thread(timersServer, "nio-多路复用器").start();
}

}


public class MultipexerTimeServer implements Runnable {

private Selector selector;

private ServerSocketChannel serverSocketChannel;

private volatile boolean stop;

public MultipexerTimeServer(String addr,int point){
try {
selector=Selector.open();
serverSocketChannel=ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(addr, point));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("socket服务端:"+serverSocketChannel.socket().getInetAddress()+":"+serverSocketChannel.socket().getLocalPort()+"");
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}

public void stop(){
this.stop=true;
}

@Override
public void run() {
while(!stop){
try {
selector.select(1000);
Set<SelectionKey> selectionKeys=selector.selectedKeys();
if(selectionKeys !=null && selectionKeys.size()>0){
Iterator<SelectionKey> it=selectionKeys.iterator();
SelectionKey key=null;
while(it.hasNext()){
key=it.next();
it.remove();
try {
handleInput(key);
} catch (Exception e) {
if(key!=null){
key.cancel();
if(key.channel()!=null){
try {
key.channel().close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
if(selector!=null){
try {
selector.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

private void handleInput(SelectionKey key) throws IOException{
if(key.isValid()){
//处理新接入的请求
if(key.isAcceptable()){
ServerSocketChannel ssc=(ServerSocketChannel)key.channel();
SocketChannel sc=ssc.accept();
sc.configureBlocking(false);
sc.register(selector,SelectionKey.OP_READ);
SocketAddress clientAddress =sc.getRemoteAddress();
System.out.println("socket链接新客户端:" + clientAddress);
}
if(key.isReadable()){
//读取数据
SocketChannel sc=(SocketChannel)key.channel();
ByteBuffer readBuffer=ByteBuffer.allocate(1024);
int readBytes=sc.read(readBuffer);
if(readBytes>0){
readBuffer.flip();
byte[] bytes=new byte[readBuffer.remaining()];
readBuffer.get(bytes);
String body=new String(bytes, Charset.forName("GBK"));
SocketAddress clientAddress =sc.getRemoteAddress();
System.out.println("socket链接老客户端:" + clientAddress);
System.out.println("服务器接收数据:"+body);
//然后回写点数据给客服端
SimpleDateFormat  dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=dateFormat.format(new Date());
String res="来自与服务端的回应,时间:"+ time;
doWrite(sc,res);
}else if(readBytes<0){
key.cancel();
sc.close();
}else{
//System.out.println("服务器收到0字节数据...");
}
}
}
}

private void doWrite(SocketChannel sc,String res) throws IOException{
if(res!=null && res.trim().length()>0){
byte[] bytes=res.getBytes();
ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
byteBuffer.put(bytes);
byteBuffer.flip();
sc.write(byteBuffer);
}
}


代码不想解释太多,有空整理一下nio的基本概念...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: