kotlin中的文件字节错误。如何正确转移?

时间:2016-08-23 06:07:44

标签: android file kotlin messagepack kotlin-android-extensions

我想将带有tcp客户端的文件传输到服务器,但是图像文件出错了。

我的客户端代码是

for msplitin [stext.split('\n')]:
            for num, items in enumerate(stext,1):
                if items.strip().startswith("here is") and items.strip().endswith(".txt"):
                       gmsf = open(os.path.join(os.getcwd()+"\txt", items[8:]), "r")
                        gmsfstr = gmsf.read()
                        newline = items.replace(items, gmsfstr)

我的服务器代码是

import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream
import org.msgpack.core.MessageBufferPacker
import org.msgpack.core.MessagePack
import org.msgpack.core.MessageUnpacker
import java.io.*
import java.net.Socket
import java.util.*

fun main(args: Array<String>) {
    fileClient("localhost",1988,"fruit.jpg")
}

class fileClient (host:String, port:Int, file:String){
    var s : Socket ?= null
    var out = ByteArrayOutputStream()
    var msg : MessageBufferPacker = MessagePack.newDefaultBufferPacker()

    init {
        try {
            s = Socket(host,port)
            sendFile(file)
        }catch (e:Exception){
            e.printStackTrace()
        }
    }

    @Throws(IOException::class)
    fun sendFile(file: String) {
        val dos = DataOutputStream(s!!.getOutputStream())
        val buffer = ByteArray(4096)
        val filebytes = File(file).readBytes()
        var msgdata = ByteOutputStream()

        msg.packString(file)
        msg.packBinaryHeader(filebytes.size)
        msg.writePayload(filebytes)

        msg.close()



        val data = msg.toByteArray()
        val datasize = data.size
        val ins = ByteArrayInputStream(data)
        dos.writeInt(datasize)
        while (ins.read(buffer) > 0) {
            dos.write(buffer)
        }
        dos.close()
    }
}

我要传输的文件是 enter image description here

但转移后,服务器上的图像是这样的。 enter image description here

如何正确传输此文件?

1 个答案:

答案 0 :(得分:1)

我没有成功复制你的问题。但是我想我发现了可能导致文件传输损坏的错误。

在你的服务器代码中有一个无限循环,它会立即返回方法,而其余的方法无法访问。这是关闭连接和流的清理代码。很可能OutputStream未正确关闭,这是文件写入损坏的原因。

这就是服务器代码的样子:

val datalen = dis.readInt() // data length

if (datalen > 0) {
    var finaldata = ByteArray(datalen)
     var process = 0;
     while (process <= datalen) {
        read = dis.read(buffer)
        if (read < 0) {
            break
        }
        msgdata.write(buffer)
        process += 4096
    }
    println(process.toString() + " " + datalen.toString())
    val allData = msgdata.toByteArray().slice(0..datalen).toByteArray()
    unpackByte(allData)

}

msgdata.close()
dis.close()

while循环是不必要的。另外,你可能应该break循环,而不是函数return

P.S。 您是否考虑过使用IOUtils来处理所有IO读/写操作?使用此库只需几行代码即可替换一半代码。