重新连接到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,并且您没有重新连接。