kotlin,socket网络传输数据

MainActivity.kt

Kotlin 复制代码
package com.example.applicationtest2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
//import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.Button
import android.widget.TextView
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileInputStream
import java.net.Socket


class MainActivity : AppCompatActivity() {
    private lateinit var transferButton: Button
    private lateinit var resultTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        transferButton = findViewById(R.id.transferButton)
        resultTextView = findViewById(R.id.resultTextView)

        transferButton.setOnClickListener {
            Thread {
                val serverAddress = "127.0.0.1" // Kotlin 服务器的 IP 地址
                val serverPort = 12345 // Kotlin 服务器的端口号
                val filePath = "/path/to/file" // 待传输的文件路径

                try {
                    val socket = Socket(serverAddress, serverPort)
                    val file = File(filePath)

                    val outputStream = BufferedOutputStream(socket.getOutputStream())
                    val inputStream = BufferedInputStream(FileInputStream(file))

                    // 发送文件名和文件大小给 Kotlin 服务器
                    val fileNameBytes = file.name.toByteArray()
                    val fileSizeBytes = file.length().toString().toByteArray()
                    outputStream.write(fileNameBytes.size)
                    outputStream.write(fileNameBytes)
                    outputStream.write(fileSizeBytes.size)
                    outputStream.write(fileSizeBytes)
                    outputStream.flush()

                    // 接收服务器确认
                    val confirmation = socket.getInputStream().read()
                    if (confirmation == 1) {
                        // 开始传输文件数据
                        val buffer = ByteArray(8192)
                        var bytesRead: Int
                        while (inputStream.read(buffer).also { bytesRead = it } != -1) { //从输入流读取数据到缓冲区中
                            outputStream.write(buffer, 0, bytesRead)  //将缓冲区的数据写入到输出流中
                            outputStream.flush()

                            // 等待对方确认
                            val acknowledgement = socket.getInputStream().read()
                            if (acknowledgement != 1) {
                                runOnUiThread {
                                    resultTextView.text = "传输失败,未收到对方确认"
                                }
                                break
                            }
                        }

                        socket.shutdownOutput()

                        // 接收并显示传输结果
                        val result = socket.getInputStream().bufferedReader().readLine()
                        runOnUiThread {
                            resultTextView.text = result
                        }
                    } else {
                        runOnUiThread {
                            resultTextView.text = "传输失败,对方拒绝接收"
                        }
                    }

                    inputStream.close()
                    outputStream.close()
                    socket.close()
                } catch (e: Exception) {
                    e.printStackTrace()
                    runOnUiThread {
                        resultTextView.text = "传输失败:" + e.message
                    }
                }
            }.start()
        }
    }
}

activity_mian.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/transferButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="传输" />

    <TextView
        android:id="@+id/resultTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />


</LinearLayout>
相关推荐
久绊A1 小时前
网络信息系统的整个生命周期
网络
_PowerShell1 小时前
[ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令
网络·dos命令入门到精通·dos命令基础·dos命令之文件操作命令详解·文件复制命令详解·文件对比命令详解·文件删除命令详解·文件查找命令详解
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
qq_254674413 小时前
工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置
网络
JokerSZ.3 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
数据猎手小k5 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小106 小时前
JavaWeb项目-----博客系统
android