【问题标题】:If isConnected returns true, why does Exeption say that it isn't connected?如果 isConnected 返回 true,为什么 Exeption 说它没有连接?
【发布时间】:2020-07-28 05:08:55
【问题描述】:

我正在编写一个应该通过蓝牙发送文件的 android 应用程序。现在我只是想发送文本。发送设备似乎可以正确发送,而接收设备正在接收来自其他设备的连接。接收器能够从侦听服务器套接字中获取一个套接字,并从中获取一个输入流。我的问题是它无法从输入流中读取。真正让我困惑的部分是我得到的异常表明相关的套接字已关闭,但是 Socket.isConnected() 在尝试读取之前和发生异常之后都返回 true。这怎么可能?这段代码怎么能:

class ReceiveThread(val socket: BluetoothSocket):Thread() {

var count:Int = 0
var bytes:Int = 0
val buffer:ByteArray = ByteArray(1024)
val byteList = mutableListOf<Byte>()
val inStream:InputStream

init {
    inStream = socket.inputStream
}

override fun run() {
    BluetoothService.log("Begin ${BTS_Constants.THREAD_RECEIVE}")
    BluetoothService.log("preparing to read data (socket connected): ${socket.isConnected}")
    name = BTS_Constants.THREAD_RECEIVE

    try {
        bytes = inStream.read(buffer)
    }catch (e:Exception){
        BluetoothService.log("error reading from stream (socket connected):${socket.isConnected}", e)
        BluetoothService.state = BTS_Constants.STATE_NONE
    }

    if (byteList.size>0) BluetoothService.log("data read: ${byteList.get(0) as Char}") else BluetoothService.log("failed to get")
}

fun cancel() = inStream.close()
}

导致此日志消息:

11-28 23:23:33.958 25325-25534/com.example.zemcd.fileblue D/BluetoothService: Begin RECEIVE
11-28 23:23:33.958 25325-25534/com.example.zemcd.fileblue D/BluetoothService: preparing to read data (socket connected): true
11-28 23:23:34.035 25325-25534/com.example.zemcd.fileblue E/BluetoothService: error reading from stream (socket connected): true

java.io.IOException: bt socket closed, read return: -1

at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:588)

at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)

at java.io.InputStream.read(InputStream.java:101)

at com.example.zemcd.fileblue.ReceiveThread.run(BluetoothService.kt:263)
11-28 23:23:34.035 25325-25534/com.example.zemcd.fileblue D/BluetoothService: failed to get

如果套接字已关闭,为什么返回 true?如何追踪我的套接字关闭的位置?请帮助我理解这一点。

【问题讨论】:

    标签: android sockets bluetooth kotlin


    【解决方案1】:

    isConnected() 告诉您Socket 的状态。如果您曾经连接或接受过它,它会返回 true。即使在你关闭它之后。当对等方断开连接时,它不会神奇地变为假。

    异常告诉你连接的状态

    【讨论】:

    • 有什么方法可以让我跟踪连接状态吗?这样我就可以看到连接何时关闭?类似于 isConnected 的东西可能只是连接状态?或者任何其他方式来找出连接被关闭的地方?
    • 你已经找到了。执行 I/O 时会引发异常。除了SocketTimeoutException 之外的任何IOException 对连接都是致命的。
    • 所以当那个异常被抛出时,连接就在那里关闭了?但是不是因为连接关闭而发生异常吗?
    • 请给我解释一下。这会很有帮助。
    • 如果你正在发送,连接已经关闭并被网络检测到,下次发送时会报告给你。如果您在接收中阻塞,则连接刚刚断开。
    【解决方案2】:

    我遇到了同样的问题 我用这段代码解决了这个问题

    socket.socket.IsConnected
    

    第一个socket是一个连接服务器的变量socket。

    第二个socket 是你的服务器,你可以得到任何你想要的东西

    如果您与服务器有连接,IsConnected 会通知您

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2016-12-08
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多