青圆子 2015-11-25 11:26 采纳率: 0%
浏览 1998

java这个简单的服务器我要如何读取客户端的输入信息?

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,我要给他返回时间。。。大神求助!!

  • 写回答

1条回答

  • Wales_ 2015-11-27 08:39
    关注

    兄弟,这个确实挺乱的,自己再捋一捋吧

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler