Java - 无法连接到服务器 - 连接被拒绝

时间:2013-09-10 16:25:56

标签: java android connection nio

我正在使用java.nio包在两个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(我尝试了不同的端口)并且它们位于同一个LAN中,因为UDP数据包实际上是从一个设备到另一个设备。可能是什么问题?

1 个答案:

答案 0 :(得分:2)

“连接被拒绝”表示来自客户端的连接尝试到达服务器(或 服务器),但没有任何接受指定IP地址和端口的连接。由于您在两种情况下都使用端口8001,因此最简单的解释是您的服务器或客户端没有使用正确的IP地址与另一端进行通信。

您正在使用此行创建服务器套接字:

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

最简单的解释是InetAddress.getLocalHost()没有返回客户端使用的相同IP地址。