【问题标题】:Why has server socket to be opened before client socket? [closed]为什么要在客户端套接字之前打开服务器套接字? [关闭]
【发布时间】:2014-07-23 04:47:26
【问题描述】:

我使用 Java 中的套接字编程。我连接了一台电脑和安卓平板电脑。服务器是电脑,客户端是平板电脑。当我首先启动平板电脑时,无法连接套接字。但是,当我首先启动 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{

        }
    }

编辑:第一个 while ,即使用 InetAddress.isReachable 的检查条件,始终为 TRUE。这意味着 isReachable 在任何时候都是错误的。当我删除它时,可以建立连接。但是,问题仍然是一样的。

【问题讨论】:

  • 只需摆脱 isReachable() 调用。没有用。套接字连接将成功或失败。这就是你所需要的。

标签: java android sockets connection client-server


【解决方案1】:

客户端套接字是连接到服务器的东西。
如果没有服务器在运行,它就没有可以连接的东西。

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

【讨论】:

  • 没有没有。我的意思是,当我开始使用平板电脑然后开始电脑时,无法建立套接字。反向完成后,我的意思是先电脑,然后是平板电脑,它可以工作。在这两种情况下,PC 和平板电脑都是打开的。
  • @user14570:嗯?您仍然需要先启动服务器。
  • 我无法理解这一点。 :S 可能是端口无法打开。大多数时候我都试过了。首先是平板电脑,然后是电脑。但是它没有用:(我会再试一次
  • 您无法连接到未运行的服务器。
  • 你的意思是我已经启动了第一个服务器端,PC端?可以先启动平板电脑。
【解决方案2】:

服务器套接字正在侦听客户端以建立连接(例如等待接听电话的人)。如果客户端尝试连接(拨打电话)并且没有人在听(没有人接听电话),则客户端无事可做,因此它放弃并抛出异常(挂断电话)。稍后再尝试连接(重拨电话)。

【讨论】:

  • 确实如此。但我在服务器端使用了 while(true)。当它给出错误时,它会一次又一次地尝试。它对客户端也有效。它也有 while like true 选项
【解决方案3】:

在连接尝试失败后,您无法重新连接套接字,因为异常会告诉您。您必须关闭它并创建一个新的。

【讨论】:

  • 第一次工作,之后就失败了。
  • @EJP 我认为这不是真的。文档中没有提到它,我没有看到任何 IllegalStateException。 docs.oracle.com/javase/7/docs/api/java/net/…
  • @Onur 我没猜。我没说IllegalStateException.,事实上你得到了一个SocketClosedException,所以你甚至不用自己关闭它,只需要创建一个新的。我建议您在再次发布之前尝试一下。
  • @EJP 是的,你是对的,对不起。我更新了我的答案。谢谢,我不知道。
  • @Onur 最好不要评论你不知道的事情。
【解决方案4】:

查看isConnected 的文档:Socket

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 {

        }
    }

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2015-01-03
    • 2013-02-17
    • 2013-01-16
    • 1970-01-01
    • 2013-09-04
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多