Android套接字空异常

时间:2019-01-18 20:42:04

标签: java android sockets kotlin

我是android开发的新手。我有一个服务器和一个客户端应用程序。我正在尝试使用套接字将图片从客户端应用发送到服务器应用,这是客户端应用的代码:

    private inner class ClientRxThread internal constructor(internal var dstAddress: String, internal var dstPort: Int) : Thread() {

    override fun run() {
        var socket: Socket? = null

        try {
            socket = Socket(serverIp, 8080)

            val file = File(Environment.getExternalStorageDirectory().absolutePath, "test.png")

            val ois = ObjectInputStream(socket.getInputStream())
            val bytes: ByteArray
            var fos: FileOutputStream? = null
            try {
                bytes = ois.readObject() as ByteArray
                fos = FileOutputStream(file)
                fos.write(bytes)
            } catch (e: ClassNotFoundException) {
                // TODO Auto-generated catch block
                e.printStackTrace()
            } finally {
                fos?.close()

            }

            socket.close()

            this@MainActivity.runOnUiThread {
                Toast.makeText(this@MainActivity,
                    "Finished",
                    Toast.LENGTH_LONG).show()
            }

        } catch (e: IOException) {

            e.printStackTrace()

            val eMsg = "Something wrong: " + e.message
            this@MainActivity.runOnUiThread {
                Toast.makeText(this@MainActivity,
                    eMsg,
                    Toast.LENGTH_LONG).show()
            }

        } finally {
            if (socket != null) {
                try {
                    socket.close()
                } catch (e: IOException) {
                    // TODO Auto-generated catch block
                    e.printStackTrace()
                }

            }
        }
    }
}

我的服务器应用代码:

class MainActivity : AppCompatActivity() {

private lateinit var infoIp: TextView
internal lateinit var infoPort: TextView
internal var serverSocket: ServerSocket? = null

private lateinit var serverSocketThread: ServerSocketThread

private val ipAddress: String
    get() {
        var ip = ""
        try {
            val enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces()
            while (enumNetworkInterfaces.hasMoreElements()) {
                val networkInterface = enumNetworkInterfaces
                        .nextElement()
                val enumInetAddress = networkInterface
                        .inetAddresses
                while (enumInetAddress.hasMoreElements()) {
                    val inetAddress = enumInetAddress.nextElement()

                    if (inetAddress.isSiteLocalAddress) {
                        ip += ("SiteLocalAddress: "
                                + inetAddress.hostAddress + "\n")
                    }

                }

            }

        } catch (e: SocketException) {
            e.printStackTrace()
            ip += "Something Wrong! " + e.toString() + "\n"
        }

        return ip
    }

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    infoIp = findViewById<TextView>(R.id.infoip)
    infoPort = findViewById<TextView>(R.id.infoport)

    infoIp.text = ipAddress

    serverSocketThread = ServerSocketThread()
    serverSocketThread.start()
}

override fun onDestroy() {
    super.onDestroy()

    if (serverSocket != null) {
        try {
            serverSocket!!.close()
        } catch (e: IOException) {
            // TODO Auto-generated catch block
            e.printStackTrace()
        }

    }
}

inner class ServerSocketThread : Thread() {

    override fun run() {
        var socket: Socket? = null

        try {
            serverSocket = ServerSocket(SocketServerPORT)
            this@MainActivity.runOnUiThread(Runnable { infoPort.text = "I'm waiting here: " + serverSocket!!.localPort })

            while (true) {
                socket = serverSocket!!.accept()
                val fileTxThread = FileTxThread(socket)
                fileTxThread.start()
            }
        } catch (e: IOException) {
            // TODO Auto-generated catch block
            e.printStackTrace()
        } finally {
            if (socket != null) {
                try {
                    socket.close()
                } catch (e: IOException) {
                    // TODO Auto-generated catch block
                    e.printStackTrace()
                }

            }
        }
    }

}

inner class FileTxThread internal constructor(internal var socket: Socket) : Thread() {

    override fun run() {
        val file = File(
                Environment.getExternalStorageDirectory(),
                "my_pic.png")

        val bytes = ByteArray(file.length().toInt())
        val bis: BufferedInputStream
        try {
            bis = BufferedInputStream(FileInputStream(file))
            bis.read(bytes, 0, bytes.size)

            val oos = ObjectOutputStream(socket.getOutputStream())
            oos.writeObject(bytes)
            oos.flush()

            socket.close()

            val sentMsg = "File sent to: " + socket.inetAddress
            this@MainActivity.runOnUiThread(Runnable {
                Toast.makeText(this@MainActivity,
                        sentMsg,
                        Toast.LENGTH_LONG).show()
            })

        } catch (e: FileNotFoundException) {
            // TODO Auto-generated catch block
            e.printStackTrace()
        } catch (e: IOException) {
            // TODO Auto-generated catch block
            e.printStackTrace()
        } finally {
            try {
                socket.close()
            } catch (e: IOException) {
                // TODO Auto-generated catch block
                e.printStackTrace()
            }

        }

    }
}

companion object {

    internal val SocketServerPORT = 8080
}

}

但是在运行时,当我按下发送按钮时,我通过Toast消息得到了一个异常(出错:null)。我不知道自己错过了什么或做错了什么。

在发送时这里是logcat:

01-19 01:33:52.367 244-564/? V/AudioPolicyManagerBase: setOutputDevice() setting same device 0000 or null device for output 2
01-19 01:33:55.227 783-977/? E/xxxxxxbtsdcard: checkUser: useridlist=null, currentuser=0
01-19 01:33:55.227 783-977/? E/xxxxxxbtsdcard: checkUser: useridlist=null, currentuser=0
01-19 01:33:55.237 783-977/? E/xxxxxxbtsdcard: checkUser: useridlist=null, currentuser=0
01-19 01:33:55.237 783-977/? E/xxxxxxbtsdcard: checkUser: useridlist=null, currentuser=0
01-19 01:33:56.577 3765-3765/? D/wear: [wear] connection failed, ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null}
01-19 01:33:56.577 3765-3864/? D/wear: [wear] google api client connection failed, null, null

0 个答案:

没有答案