为什么要在客户端套接字之前打开服务器套接字?

时间:2014-06-03 00:05:06

标签: java android sockets connection client-server

我在Java中使用套接字编程。我连接了一台PC和Android平板电脑。服务器是pc,客户端是平板电脑。当我首先启动平板电脑时,无法连接插座。但是,当我首先启动pc时,可以连接套接字。为什么会这样?问题出在哪里?

Pc代码:

`

btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Thread t = new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    ServerSocket listener = null;
                    Socket socket = null;
                    System.out.println("Opened");
                    try {
                        listener = new ServerSocket(1515);

                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        System.out.println(e1.getMessage());
                    }
                    String answer = null;

                    while(true)
                    {

                        try {
                            socket = listener.accept();

                            DataInputStream input =
                                    new DataInputStream(socket.getInputStream());
                            answer = input.readInt()+ " ";
                            answer = answer + input.readInt();
                            input.close();
                            dName.setText(answer);

                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } finally {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }

                    }


                }
            });
            t.start();

`

平板电脑代码:

@Override
public void run() {
    // TODO Auto-generated method stub
    boolean check = false;
    while(!check)
    {
        try {
            check = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, 2, 86 }).isReachable(1000);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    while(!socket.isConnected()){
        try {
            socket.connect(sockaddr, 1000);
            //  DataInputStream input =
            //          new DataInputStream(socket.getInputStream());
            //  int result = input.readInt();
            //  if(result == -2)
            //  {
            //      MainActivity.MainAct.StartUpdateActivity();
            //  }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            //text.setText(e.getMessage());
            System.out.println(e.getMessage());
        }finally{

        }
    }

编辑:使用InetAddress.isReachable的检查条件始终为TRUE。这意味着isReachable始终为false。当我删除它时,可以建立连接。但问题仍然存在。

4 个答案:

答案 0 :(得分:3)

客户端套接字是连接到服务器的东西 如果没有服务器正在运行,则无法连接到它。

服务器套接字只接受连接。

答案 1 :(得分:2)

服务器套接字正在侦听客户端进行连接(就像等待接听电话的人一样)。如果客户端尝试连接(拨打电话)并且没有人在听(没有人接听电话),那么客户端就没有什么可做的,所以它放弃并抛出异常(挂起)打电话)。尝试再次连接(重拨手机)。

答案 2 :(得分:1)

在连接尝试失败后,您无法重新连接套接字,例外情况会告诉您。你必须关闭它并创建一个新的。

答案 3 :(得分:0)

查看isConnectedSocket

的文档
Returns the connection state of the socket.
Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed.

所以你的

while(!socket.isConnected()){ 

行仅在第一次成功连接之前有效。

<强>更新

似乎EJP's answer也是如此,即使您的while(!socket.isConnected()){正常工作,您也无法使用已关闭的套接字建立连接,您最终会java.net.SocketException: Socket closed。所以你必须每次都重新创建套接字。

    while (!shouldIStop()/*some condition in case if you ever want to stop*/) {
        Socket socket = new Socket();
        try {
            socket.connect(yourAddress, 1000);
            //do something...
        } catch (IOException e) {

        } finally {

        }
    }