NIO实现的 DD聊天室
下载地址https://download.csdn.net/download/qq_31408331/11020169(不知道为啥默认需要用积分)
https://download.csdn.net/download/qq_31408331/11020167
---------------------------------------------------------------------------------------------------------------------
package org.lxs.nio;
/**
* DD数据传输协议
* example:
* out~username~password
* @author lxs
*
*/
public enum DDProtocol {
//授权协议
AUTH {
@Override
public String message(String ... str) {
StringBuffer retV = new StringBuffer("AUTH");
for(int i=0; i<str.length; i++) {
retV.append(proSeparator+str[i]);
}
return retV.toString();
}
},
//
OUT {
@Override
public String message(String... str) {
StringBuffer retV = new StringBuffer("OUT");
for(int i=0; i<str.length; i++) {
retV.append(proSeparator+str[i]);
}
return retV.toString();
}
},
//广播协议
BROADCAST {
@Override
public String message(String ... str) {
StringBuffer retV = new StringBuffer("BROADCAST");
for(int i=0; i<str.length; i++) {
retV.append(proSeparator+str[i]);
}
return retV.toString();
}
},
//定点传输协议
FIXEDPOINT {
@Override
public String message(String ... str) {
StringBuffer retV = new StringBuffer("FIXEDPOINT");
for(int i=0; i<str.length; i++) {
retV.append(proSeparator+str[i]);
}
return retV.toString();
}
},
//数据同步
DATASYNC {
@Override
public String message(String ... str) {
StringBuffer retV = new StringBuffer("DATASYNC");
for(int i=0; i<str.length; i++) {
retV.append(proSeparator+str[i]);
}
return retV.toString();
}
};
public static final String proSeparator = "`";
public abstract String message(String ... str);
}
-----------------------------------------------------------------------------------------------------------------------------
package org.lxs.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.logging.Logger;
/**
* 服务端
* @author lxs
*
*/
public class DDServer {
private static final Logger log = Logger.getGlobal();
private int port;
private ServerSocketChannel ssc;
//private SocketChannel sc;
private Selector selector;
private volatile List<Map<String,Object>> hosts;//登入用户记录
private List<String> whiteList;//白名单
private List<String> blackList;//黑名单
private static final DateFormat df = DateFormat.getDateTimeInstance();
public DDServer(int port) {
this.port = port;
this.hosts = new ArrayList<Map<String,Object>>();
}
public DDServer start() {
try {
ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.bind(new InetSocketAddress(port));
selector = Selector.open();
ssc.register(selector, SelectionKey.OP_ACCEPT);
ssc.accept();
log.info("服务端启动完毕!端口号为:"+port);
} catch (IOException e) {
//e.printStackTrace();
}
return this;
}
public void listen() {
try {
log.info("服务端开启监听连接!");
while(true) {
selector.select();
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while(iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
if(key.isValid()) {
if(key.isAcceptable()) {
beforLogin(k