0

java.nio パッケージを使用して、2 つの Android デバイス間の TCP クライアント サーバー接続を作成しています。クライアントが行うことは次のとおりです。

SocketChannel sc = SocketChannel.open();
sc.connect(new InetSocketAddress(gameAddr, 8001));

サーバーが行うことは次のとおりです。

try 
        {
            tokenizer = new FixedSeparatorMessageTokenizer(Strings.DELIMITER, Charset.forName("UTF-8"));
            selector = SelectorProvider.provider().openSelector();
            sChan = ServerSocketChannel.open();
            InetSocketAddress iaddr = new InetSocketAddress(InetAddress.getLocalHost(), 8001);

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

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

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

        Iterator<SelectionKey> it;

        try {
            while (selector.isOpen()) 
            {

                selector.select();

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

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

                    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("Connection from " + newClient.socket().getInetAddress().getHostAddress());
                    }

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

                        System.out.println("Data from " + sc.socket().getInetAddress().getHostAddress());

                        if (sc.read(data) == -1) //is this a socket close?
                        {

                            continue;
                        }

                        data.flip();
                        tokenizer.addBytes(data);
                        while(tokenizer.hasMessage())
                        {
                            ParsedMessage pm = new ParsedMessage(tokenizer.nextMessage());
                            pm.setAttachment(sc);
                            synchronized(Q) { Q.add(pm); }
                        }

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

どちらも同じポート 8001 を使用しており (別のポートを試しました)、UDP パケットが実際にあるデバイスから別のデバイスに到達するため、同じ LAN 内にあります。何が問題になる可能性がありますか?

4

1 に答える 1

2

「接続が拒否されました」は、クライアントからの接続試行がサーバー (またはサーバー) に到達した、指定された IP アドレスとポートで接続を受け入れるものがなかったことを意味します。どちらの場合もポート 8001 を使用しているため、最も簡単な説明は、サーバーまたはクライアントが正しい IP アドレスを使用して相手側と通信していないことです。

次の行を使用して、サーバー ソケットを作成しています。

InetSocketAddress iaddr = new InetSocketAddress(InetAddress.getLocalHost(), 8001);

最も簡単な説明はInetAddress.getLocalHost()、クライアントが使用しているのと同じ IP アドレスを返さないことです。

于 2013-09-10T17:17:14.040 に答える