我正在创建一个应用程序,使用 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/