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

时间:2012-12-17 06:18:37

标签: 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传输文件的正确方法吗?如果是这样,请告诉我我在哪里做错了。 提前谢谢。

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

1 个答案:

答案 0 :(得分:1)

在服务器端代码中:

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

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

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

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