Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
重新连接到Android套接字以等待服务器 P>在Windows中有TCP服务器,用C++编程,客户端为java,Android 4.0.4._Android_Sockets - Fatal编程技术网

重新连接到Android套接字以等待服务器 P>在Windows中有TCP服务器,用C++编程,客户端为java,Android 4.0.4.

重新连接到Android套接字以等待服务器 P>在Windows中有TCP服务器,用C++编程,客户端为java,Android 4.0.4.,android,sockets,Android,Sockets,在安卓系统中,我的连接方式如下: public boolean sendConnectRequest() { while (isSocketConnected == false) { try { if(comSocket == null) comSocket = new Socket("192.168.0.1",1531); isSocketConnected = comSocket.isCo

在安卓系统中,我的连接方式如下:

public boolean sendConnectRequest()
{
    while (isSocketConnected == false)
    {
        try {
            if(comSocket == null)
            comSocket = new Socket("192.168.0.1",1531);
            isSocketConnected = comSocket.isConnected();
            if (isSocketConnected) {
                out = comSocket.getOutputStream();
                in = comSocket.getInputStream(); 
            }
            else
                comSocket.close();
        } 
        catch (IOException ex)
        {
            Log.e("TCP Error", ex.getLocalizedMessage());
        }
    }
return true;
}
在第一次连接到服务器时,我通常不会对这段代码有任何问题

当我断开与服务器的连接时,我称之为:

public void closeConnection() {
    if (comSocket != null)
    {
        try {
            comSocket.close();
            isSocketConnected = false;
            if (out != null)
                out.close();
            if (in != null)
                out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
这就是问题所在。。。我按了一下智能手机上的home(主页)按钮,程序暂停。我再次启动程序,它调用activity中的resume函数,这反过来又开始重新连接的过程。已尝试连接,但未收到任何错误。但是,我的Windows服务器未记录任何连接。在Windows中,我知道我仍被以下位置阻止:

SOCKET connectionSocket = accept(tcpNetworkData->socket, (struct sockaddr*)&from, &fromlen);
我相信这是正常的。当我在Android端处于调试模式时,我注意到它立即从以下行返回:comSocket=newsocket(“192.168.0.1”,1531);这应该向我表明已建立连接

如果你一直跟着我。。。我还应该说,如果我关闭服务器,客户端会通过关闭连接并打开一个新连接来重置。这一次,comSocket=newsocket(“192.168.0.1”,1531)没有像它应该的那样阻塞,执行继续进行。这显然是错误的。我认为这是一个资源释放问题,但为什么呢?使用Winsock,您可以通过以下代码行解决此问题:

int so_reuseaddr = TRUE;
setsockopt(networkData->socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&so_reuseaddr,sizeof(so_reuseaddr));
你能用安卓做些类似的事情吗?或者你必须这样做吗?谢谢你的帮助

根据调用构造函数后建立的连接

当您按下home(主页)按钮时,您的应用程序进入后台,但不会立即停止,因此当您返回应用程序时,
comSocket
可能不会为空。在这种情况下,您不会再次调用构造函数,因此不会重新连接到服务器。你应该做的是

if(comSocket == null){
        comSocket = new Socket("192.168.0.1",1531);
}else{
     comSocket.connect(new InetSocketAddress("192.168.0.1",1531));
}
(请放上花括号:-)

根据上下文,一旦调用构造函数,就会建立连接

当您按下home(主页)按钮时,您的应用程序进入后台,但不会立即停止,因此当您返回应用程序时,
comSocket
可能不会为空。在这种情况下,您不会再次调用构造函数,因此不会重新连接到服务器。你应该做的是

if(comSocket == null){
        comSocket = new Socket("192.168.0.1",1531);
}else{
     comSocket.connect(new InetSocketAddress("192.168.0.1",1531));
}

(请放上花括号:-)

需要记住的是,isConnected()方法在检测远程端何时关闭了连接时不是很可靠,(

您必须通过读取或写入相关的输入/输出流来解决这个问题


尝试使用PrintWriter.checkError(),当客户端无法再连接到服务器时,它将返回true

需要记住的是,isConnected()方法在检测远程端何时关闭连接时不是非常可靠,(

您必须通过读取或写入相关的输入/输出流来解决这个问题


尝试使用PrintWriter.checkError(),当客户端无法再连接到服务器时,它将返回true

只是为了澄清,您是否在覆盖的onResume()中调用sendConnectRequest(),在onPause()中调用closeConnection()?我正在生成线程,以便不阻塞主线程。TCP线程的生成从onResume()开始。在TCP线程中,我实例化了一个类,该类负责打开和关闭TCP连接,轮询inputstream并在outputstream上发送消息。在TCP线程中,我在TCP连接后输入一个while循环,开始轮询过程。要更具体地回答您的问题,请使用sendConnectRequest()在TCP线程上的类中调用。仅当comSocket==null时才重新连接。如果单击“开始”按钮,情况可能不是这样,因为您的活动可能仍然存在。对不起,没有看到缺少的花括号。请澄清,您是否在重写的onResume()和closeConnection()中调用sendConnectRequest()在onPause()中?我正在生成一个线程,以便不阻塞主线程。TCP线程的生成从onResume()开始。在TCP线程中,我实例化了一个类,该类负责打开和关闭TCP连接,轮询inputstream并在outputstream上发送消息。在TCP线程中,我在TCP连接后输入一个while循环,开始轮询过程。要更具体地回答您的问题,请使用sendConnectRequest()在TCP线程上的类中调用。仅当comSocket==null时才重新连接。如果单击“开始”按钮,情况可能不是这样,因为您的活动可能仍然存在。哦,很抱歉,没有看到丢失的花括号这在服务器端连接断开时起作用,但我仍然无法确定当和roid客户端终止。我在回复中写道。当你说“连接已尝试,我没有收到任何错误。”,没有真正尝试连接,因为comSocket不为null,并且您没有重新连接。这在服务器端连接断开时有效,但我仍然无法确定Android客户端终止时会发生什么。我在回复中写道。当您说“连接已尝试,我没有收到错误”时,未真正尝试连接,因为comSocket不为null,并且您没有重新连接。