Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么服务器套接字要在客户端套接字之前打开?_Java_Android_Sockets_Connection_Client Server - Fatal编程技术网

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

Java 为什么服务器套接字要在客户端套接字之前打开?,java,android,sockets,connection,client-server,Java,Android,Sockets,Connection,Client Server,我使用Java中的套接字编程。我连接了一台pc和安卓平板电脑。服务器是pc,客户端是平板电脑。当我第一次启动平板电脑时,插座无法连接。然而,当我第一次启动电脑时,插座可以连接。为什么会这样?问题在哪里 Pc代码: ` ` 平板电脑代码: @Override public void run() { // TODO Auto-generated method stub boolean check = false; while(!check) { try

我使用Java中的套接字编程。我连接了一台pc和安卓平板电脑。服务器是pc,客户端是平板电脑。当我第一次启动平板电脑时,插座无法连接。然而,当我第一次启动电脑时,插座可以连接。为什么会这样?问题在哪里

Pc代码:

`

`

平板电脑代码:

@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的检查条件,始终为真。这意味着isReachable在任何时候都是假的。当我移除它时,可以建立连接。但是,问题仍然是一样的。

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


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

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


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

服务器套接字正在侦听客户端建立连接(就像有人在等待接听电话)。如果客户端尝试连接(拨打电话),但没有人接听(没有人接听电话),则客户端无需执行任何操作,因此它会放弃并抛出异常(挂断电话)。请稍后再尝试连接(重拨电话)。

服务器套接字正在侦听客户端建立连接(如有人等待接听电话)。如果客户端尝试连接(拨打电话),但没有人接听(没有人接听电话),则客户端无需执行任何操作,因此它会放弃并抛出异常(挂断电话)。请稍后再尝试连接(重拨电话)。

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

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

检查文档中的
是否已连接:

那么你的

while(!socket.isConnected()){ 
线路仅在第一次成功连接之前工作

更新

这似乎也是正确的,即使(!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 {

        }
    }

检查文档中是否连接了

那么你的

while(!socket.isConnected()){ 
线路仅在第一次成功连接之前工作

更新

这似乎也是正确的,即使(!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 {

        }
    }


不,不。我的意思是,当我先启动平板电脑,然后启动pc时,无法建立套接字。当反向操作完成时,我的意思是先启动pc,然后启动平板电脑,它可以工作。在这两种情况下,pc和平板电脑都是打开的。@user14570:Huh?您仍然需要先启动服务器。我不明白这一点。:S可能是端口无法打开。我尝试了很多次。第一台平板电脑然后是pc。但它不起作用:(我将再次尝试。您无法连接到未运行的服务器。您的意思是我先启动服务器端,然后启动pc端?平板电脑可能会先启动。不,不。我的意思是,当我先启动平板电脑,然后启动pc时,无法建立套接字。当反向操作完成时,我的意思是先启动pc,然后启动平板电脑,它会工作。在这两种情况下,pc和平板电脑都是打开的。@user14570:嗯?您仍然需要先启动服务器。我不明白这一点。:S可能是端口无法打开。我尝试了很多次。首先是平板电脑,然后是pc。但是它不起作用:(我会再试一次您无法连接到未运行的服务器。您的意思是我必须先启动服务器端,pc端吗?平板电脑可能会先启动。这是真的。但我使用了while(真的)对于服务器端。当它给出错误时,它会一次又一次地重试。它对客户端也是有效的。它还有while like true选项。它是真的。但是我对服务器端使用while(true)。当它给出错误时,它会一次又一次地重试。它对客户端也是有效的。它还有while like true选项只是去掉isReachable()调用。这是毫无意义的。套接字连接将成功或失败。这就是您所需要的。只需去掉isRecable()调用。这是毫无意义的。套接字连接将成功或失败。这就是你所需要的。第一次它工作时,之后它就失败了。@EJP我认为这不是真的。文档中没有提到它,我也没有看到任何非法状态异常。@Onur我不是在猜测。我没有说任何关于
非法状态异常的事。
事实上你知道获取一个
SocketClosedException
,这样你甚至不必自己关闭它,只需创建一个新的。我建议你在再次发布之前尝试一下。@EJP是的,你是对的,对不起。我更新了我的答案。谢谢,我不知道。@Onor最好不要对你不知道的事情发表评论。第一次成功,之后失败。@EJP我不这么认为nk这是真的。文档中没有提到它,我也没有看到任何非法状态异常。@或者我不是在猜测。我没有说任何关于
非法状态异常的事情。
事实上你得到了一个
SocketClosedException
,所以你甚至不必自己关闭它,只需创建一个新的。我建议你先尝试一下再次发布。@EJP是的,你是对的,对不起。我更新了我的答案。谢谢,我不知道。@Onur最好不要评论你不知道的事情。