Android中判断socket通信断开

你好!这里是风筝的博客,欢迎和我一起交流。

如果本篇博客对您有帮助,或许可以在下方评论给我留个言呀。


可以引起网络连接关闭的情况有以下4种:
1.  直接调用Socket类的close方法。
2.  只要Socket类的InputStream和OutputStream有一个关闭,网络连接自动关闭(必须通过调用InputStream和OutputStream的 close方法关闭流,才能使网络可爱接自动关闭)。
3.  在程序退出时网络连接自动关闭。
4.  将Socket对象设为null或未关闭最使用new Socket(…)建立新对象后,由JVM的垃圾回收器回收为Socket对象分配的内存空间后自动关闭网络连接。


socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但这些方法都是本地端的状态:如

Socket socket = new Socket();
if(socket.isClosed()) {
                                    Log.e("连接断开了", "0");
                                }

isClose函数返回的是true或者false这些状态量,除了isClose方法,Socket类还有一个isConnected方法来判断Socket对象是否连接成功。但是,isConnected方法所判断的并不是Socket对象的当前连接状态,而是Socket对象是否曾经连接成功过,如果成功连接过,即使现在isClose返回true,isConnected仍然返回true。

好吧,那不用isConnected,用isClose方法吧。。。。。。。但是,最坑爹的来了!

如果你看了isClose的源码,就会发现他里面并没有发生心跳包之类的。所以,除非你手动的close关掉这个Socket连接,不然isClose就一直处在false的初始量。就是说,如果你现在在Socket通信,但是突然你掉线了(并不是通过close关掉的isClose依旧是返回false,坑啊。。。这个所以,这个isClosed()方法并不能作为判断Socket是否还活着的依据。。。。。

想要判断socket是否断开,还是得通过心跳包来确定啊

try {
                                    socket.sendUrgentData(0xFF);//心跳包
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }

当连接断开时,发生心跳包就出出现异常,这样就可以知道掉线了。。。。

sendUrgentData方法,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的

但是,我现在是用云服务做服务器,发现发送心跳包17次后就会在服务器端提示:你的主机中的软件中止了一个已建立的连接。

唉,现在我也没有什么办法解决这个啊......


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在AndroidSocket是一种用于网络通信的技术,它提供了在不同设备之间进行数据传输的能力。而温湿度则是指环境的温度和湿度两个参数。 如果我们想在Android应用获取温湿度数据,可以借助于传感器和Socket技术实现。首先,我们可以使用Android系统提供的温湿度传感器来获取环境的温度和湿度数据。该传感器通常是通过采集周围环境的数据,并将其转化为数字信号。 在应用,我们可以通过获取传感器管理器的实例,并注册温湿度传感器来获取温湿度数据。一旦传感器准备就绪,我们就可以通过回调方法获取最新的温湿度数据。 接下来,我们可以使用Socket技术将获取到的温湿度数据发送给特定的目标设备。通过创建一个Socket客户端,我们可以指定目标设备的IP地址和端口号,并将温湿度数据发送给目标设备。 在目标设备上,我们需要创建一个Socket服务器,以便接收来自Android设备的温湿度数据。通过监听指定的端口号,我们可以接收到来自Android设备的连接,并读取传输的温湿度数据。 通过这种方式,我们可以实现Android应用与目标设备之间的温湿度数据传输。同时,我们可以根据具体需求对数据进行处理和展示,例如可以将数据保存到数据库,或者在目标设备上显示温湿度曲线图等。 总体而言,通过借助Android的传感器和Socket技术,我们可以方便地进行温湿度数据的获取和传输,进一步实现与其他设备间的数据交互。 ### 回答2: Androidsocket温湿度是指在Android系统通过Socket编程来实现对温湿度传感器进行数据读取和处理的方式。 在Android,可以通过使用Socket对象来建立与服务器或其他设备的网络连接。温湿度传感器通常连接在一个服务器上,通过网络将采集到的温湿度数据传输到Android设备上进行处理和展示。 首先,需要通过Socket对象建立与服务器的连接。在Android,可以使用Socket类的构造函数来创建一个Socket对象,并指定服务器的IP地址和端口号。然后,可以使用Socket对象的输入输出流来接收和发送数据。 接下来,Android设备与服务器建立连接后,可以发送命令或请求相关的数据。服务器收到请求后,会将温湿度传感器采集到的数据通过Socket对象发送给Android设备。 为了解析和处理从服务器传回的温湿度数据,Android设备可以使用输入流来读取数据,并进行解析和展示。读取数据的方式可以使用BufferedReader类来实现。 最后,Android设备根据接收到的温湿度数据进行处理和展示。可以将数据显示在用户界面上,或者进行进一步的计算和分析。 总结来说,Androidsocket温湿度是通过Socket编程实现与温湿度传感器服务器的连接和数据交互,使得Android设备能够读取并处理温湿度数据,并进行展示和分析。这个过程需要使用Socket对象建立连接、发送请求命令、接收温湿度数据,并使用输入输出流来读写数据。 ### 回答3: AndroidSocket温湿度是指使用Socket技术进行温湿度数据传输的Android应用程序。Android平台提供了Socket API,开发人员可以利用它来实现与远程服务器或其他设备之间的数据通信。 在温湿度应用Android设备作为客户端,使用Socket建立与服务器或传感器设备的连接。通过SocketAndroid设备可以发送请求以获取当前的温湿度数据。服务器或设备接收到请求后,会将温湿度数据通过Socket传输给Android设备。 为了实现Socket温湿度应用,开发人员需要编写Android代码来实现Socket连接和数据交换。首先,应用程序需要创建一个Socket对象,该对象表示与服务器或设备的连接。然后,开发人员可以使用Socket的输入输出流来发送请求和接收响应。通过读取输入流,Android设备可以获取温湿度数据,然后可以在应用进行显示或进行进一步的处理。 在开发Socket温湿度应用时,需要注意网络连接的稳定性和错误处理。如果网络连接断开或者服务器不可用,应用程序需要适当地处理异常情况,以确保数据的正常传输和处理。 总而言之,AndroidSocket温湿度是一种利用Socket技术进行温湿度数据传输的应用程序。通过Socket连接,Android设备可以从远程服务器或设备获取温湿度数据,并进行显示和处理。开发人员需要编写相关的Android代码来实现Socket连接和数据交互,并处理可能出现的异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值