import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
public class EchoServer {
public static int DEFAULT_PORT = 7;
public static String text="";
public static ServerSocketChannel server;
public static SocketChannel client ;
public static ByteBuffer output ;
public static void main(String[] args){
int port;
try{
port = Integer.parseInt(args[0]);
}catch(RuntimeException ex){
port = DEFAULT_PORT;
}
System.out.println("Listening for connertions on port "+port);
ServerSocketChannel serverChannel;
Selector selector;
try{
serverChannel = ServerSocketChannel.open();
ServerSocket ss = serverChannel.socket();
InetSocketAddress address = new InetSocketAddress(port);
ss.bind(address);
serverChannel.configureBlocking(false);
selector =Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}catch(IOException ex){
ex.printStackTrace();
return;
}
while(true){
try{
selector.select();
}catch(IOException ex){
ex.printStackTrace();
break;
}
Set<SelectionKey> readyKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = readyKeys.iterator();
while(iterator.hasNext()){
SelectionKey key = iterator.next();
iterator.remove();
try{
if(key.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
System.out.println("Accepted connection from "+client);
client.configureBlocking(false);
SelectionKey clientKey = client.register(selector, SelectionKey.OP_WRITE|SelectionKey.OP_READ);
ByteBuffer buffer = ByteBuffer.allocate(100);
clientKey.attach(buffer);
}
if(key.isReadable()){
client =(SocketChannel)key.channel();
output = (ByteBuffer)key.attachment();
client.read(output);
output.flip();
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = null;
charBuffer = decoder.decode(output);
text=charBuffer.toString();
//if(text.equals("time"))
//{
//System.out.println("2");
Date date=new Date();
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=format.format(date);
byte b[] = time.getBytes();
//将十六进制字符串转换成十进制整数
//int i=Integer.decode(time);
//创建一个大小为1的字节缓冲区因为只放一个byte值
ByteBuffer bb=ByteBuffer.allocate(1);
//将十进制整数转换成二进制byte值然后存进ByteBuffer
//bb.put(b);
//打印ByteBuffer中的byte值
//byte []b1=bb.array();
client.write(output);
// output.compact();
//}
// text=output.toString();
//System.out.println(text);
//output.compact();
}
if(key.isWritable()){
client = (SocketChannel) key.channel();
output = (ByteBuffer)key.attachment();
//output.flip();
client.write(output);
//output.compact();
}
}catch(IOException ex){
key.cancel();
try{
key.channel().close();
}catch(IOException cex){}
}
}
}
}
}
这是我写的,中间有点乱,因为客户在cmd访问我的服务器如果他输入time,我要给他返回时间。。。大神求助!!
兄弟,这个确实挺乱的,自己再捋一捋吧