青圆子 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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器