1

我正在创建一个应用程序,以使用 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 传输文件的正确方法吗?如果是这样,请告诉我我做错了什么。提前致谢。

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

4

1 回答 1

1

在服务器端代码中:

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

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

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

或者,您可以只在 Android 上使用Apache FTP 客户端,在服务器端使用您最喜欢的 FTP 服务器。

于 2012-12-17T07:23:27.513 回答