java - android 中是否可以使用 java 套接字程序通过 http 传输文件?

标签 java android http sockets

我正在创建一个应用程序,使用 http 套接字程序将文件从 android 设备发送到另一个设备。这是代码, 服务器端

try {
            ServerSocket servsock = new ServerSocket(4042);
            File myFile = new File(pathToFile);
            while (true) {
                Socket sock = servsock.accept();
                byte[] mybytearray = new byte[(int) myFile.length()];
                BufferedInputStream bis = new BufferedInputStream(
                        new FileInputStream(myFile));
                bis.read(mybytearray, 0, mybytearray.length);
                OutputStream os = sock.getOutputStream();
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();
                bis.close();
                sock.close();

            }
        } catch (Exception e) {
            Toast.makeText(MyActivity.context,
                    "Failed to send file!", Toast.LENGTH_SHORT)
                    .show();
        }

和客户端,

try {
                Socket sock = new Socket(ipAddress, 4042);
                byte[] mybytearray = new byte[1024];
                InputStream is = sock.getInputStream();
                FileOutputStream fos = new FileOutputStream("/mnt/sdcard/"
                        +fileName);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = is.read(mybytearray, 0, mybytearray.length);
                bos.write(mybytearray, 0, bytesRead);
                bos.close();
                sock.close();
            } catch (Exception e) {
                Toast.makeText(MyActivity.context,
                        "Failed to download the file!", Toast.LENGTH_LONG)
                        .show();
            }

这两个代码都在 AsyncTask 类中。但是客户端总是超时。 这是在 android 中通过 Internet 传输文件的正确方法吗?如果是这样,请告诉我哪里做错了。 提前致谢。

编辑:这里,文件需要在服务器端发送,客户端正在尝试下载该文件。

最佳答案

服务器端代码:

byte[] mybytearray = new byte[(int) myFile.length()];

如果 myFile 是目标,并且您刚刚创建了它(意味着该文件尚不存在),则 myFile.length() 将为 0。这意味着您正在创建一个大小为 0 的缓冲区,读取 0 个字节。

服务器需要知道从套接字读取多少数据。解决方法可能是 android 应用程序首先写入文件的长度,服务器读取它并根据它创建一个缓冲区,然后写入完整的文件。 另外,我建议您将 .close() 调用移至 finally block 。

或者,您可以只使用例如 Apache FTP Client在 Android 和服务器端您最喜欢的 FTP 服务器上。

关于java - android 中是否可以使用 java 套接字程序通过 http 传输文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13909237/

相关文章:

java - Spring:根据 String 参数实例化一个类

java - spring cloud config ssh 连接失败

java - 无法将 INode 类型值分配给 <T extends INode> 类型变量。为什么?

java - 当我切换到包含 fragment 的 Activity 时应用程序崩溃(二进制 XML 文件行 #10 : Binary XML file line #10: Error inflating class fragment)

android - 使 BottomNavigationView 停留在其他 View 下

android - Retrofit响应是一个html代码

android - java.io.IOException : FIS_AUTH_ERROR in Android Firebase

api - REST API设计

javascript - Angular HTTP 拦截器没有命中错误函数

Django/HTTP - 使用 POST 请求发送查询字符串 - 不推荐吗?