我正在Android中开发一个将充当服务器的应用程序,这是,将有一个平板电脑作为“服务器”,并且将有其他平板电脑连接到“服务器”。
我正在尝试将Java NIO与选择器一起使用,以节省线程。但是我的问题是,我让Java代码在android的线程中运行,但是当线程运行时,它什么也没有发生。在客户端,它给出并拒绝连接拒绝。
该代码在Java应用程序中运行,但在android中未运行。

我也有互联网许可。

Java选择器:

Thread t = new Thread(new Runnable() {

    private Selector            selector;
    private ServerSocketChannel sChan;
    private List<SocketChannel> sockets;

    public void run() {

        try {
            selector = SelectorProvider.provider().openSelector();
            sChan = ServerSocketChannel.open();
            InetSocketAddress iaddr = new InetSocketAddress(InetAddress.getLocalHost(), 8000);

            sChan.configureBlocking(false);
            sChan.socket().bind(iaddr);

            System.out.println("Running on port:" + sChan.socket().getLocalPort());

            sChan.register(selector, SelectionKey.OP_ACCEPT);
            sockets = new LinkedList<SocketChannel>();

        }
        catch (IOException e) {
            e.printStackTrace();
        }

        Iterator<SelectionKey> it;

        try {
            while (true) {
                selector.select();

                it = selector.selectedKeys().iterator();
                while (it.hasNext()) {
                    SelectionKey key = it.next();

                    it.remove();
                    if (!key.isValid()) {
                        continue;
                    }

                    // Finish connection in case of an error
                    if (key.isConnectable()) {
                        SocketChannel ssc = (SocketChannel) key.channel();
                        if (ssc.isConnectionPending()) {
                            ssc.finishConnect();
                        }
                    }

                    if (key.isAcceptable()) {
                        ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
                        SocketChannel newClient = ssc.accept();

                        newClient.configureBlocking(false);
                        newClient.register(selector, SelectionKey.OP_READ);
                        sockets.add(newClient);

                        System.out.println("new client: " + newClient.socket().getInetAddress().getHostAddress());
                    }

                    if (key.isReadable()) {
                        SocketChannel sc = (SocketChannel) key.channel();
                        ByteBuffer data = ByteBuffer.allocate(sc.socket().getSendBufferSize());

                        System.out.println("new message: " + sc.socket().getInetAddress().getHostAddress());

                        if (sc.read(data) == -1) {
                            continue;
                        }

                        data.flip();

                        Teste m = (Teste) UdpUtil.byteToMessage(data.array());

                        System.out.println("message: " + m);
                        System.out.println("\n\n" + m.cenas);
                        sc.close();
                    }
                }
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
});
t.start();


和客户端应用程序:

InetSocketAddress isa = new InetSocketAddress(InetAddress.getByName("192.168.2.102"), 8000);

    SocketChannel sc = null;

    try {

        // Connect
        sc = SocketChannel.open();
        sc.connect(isa);

        // Read the time from the remote host. For simplicity we assume
        // that the time comes back to us in a single packet, so that we
        // only need to read once.

        byte[] message = UdpUtil.messageToByteMessage(new messages.Teste("hello there"));

        ByteBuffer buf = ByteBuffer.wrap(message);
        sc.write(buf);
    }
    finally {
        // Make sure we close the channel (and hence the socket)
        if (sc != null) {
            sc.close();
        }
}


注意:Teste类只是一个类,将用作android之间的消息。

我什至尝试了这个code,但一切顺利,但是选择器却没有。
我希望我明确指出问题所在。

提前致谢 :)

最佳答案

删除新的InetSocketAddress()的第一个参数,该参数用于绑定ServerSocketChannel。目前,您仅绑定到127.0.0.1,这在其他主机上看不到。通过省略该参数,您将绑定到0.0.0.0,这意味着“在所有接口上监听”。

10-07 19:17
查看更多