【问题标题】:Android: Transfer file over TCP Java SocketAndroid:通过 TCP Java 套接字传输文件
【发布时间】:2012-07-12 16:54:46
【问题描述】:

我目前正在尝试将文件从 Android 设备传输到 Java TCP 服务器,但我找不到一个很好的示例来解释我需要实现它的结构。那里有许多解释文件传输的 Java 客户端和服务器示例,但我想确保一旦将 Android 设备扔进去,这是否仍然有效。

我的问题是如何实现这种结构?如果它不起作用,我会更好地通过 HTTP 连接将文件发送到 PHP 服务器吗?我在网上看到了很多关于后一种方法的示例和文档,所以我认为它更可靠。不过,我更喜欢使用 Java 服务器。

该文件由 Android 设备记录的大量坐标组成,然后将发送到服务器。我还没有确定如何存储这些数据,但我最初打算将它们存储在原始文本文件中。

【问题讨论】:

  • 更新:我在这里找到了一个示例:lakjeewa.blogspot.co.uk/2012/03/… 但是我仍然不确定使用这个 java 实现是否更好,或者我是否应该创建一个 PHP 服务器。
  • 您的用例有什么特别之处,对上传字符流没有意义?
  • 雷神:我会在服务器上长期存储文件。我想我可以发送一个字符流,然后在服务器上编写一个文件,但我认为这种方法似乎更简单。
  • 嗯,文件传输不就是这样吗?
  • 取决于你的协议,我会假设。虽然老实说,我不知道发送文件流或字符流之间是否有很大区别。我很难想到这么低的水平:P

标签: java php android sockets file-io


【解决方案1】:

设计

您需要的第一件事是允许您在服务器上运行 Java 代码。

有多种选择。两种最流行的技术是GlassfishApache Tomcat

粗略地说,Apache Tomcat 足以用于简单的客户端-服务器通信,如果您需要做更复杂的事情,则使用 Glassfish。两者都允许Servlets(本质上是用Java 编写的自包含服务器类)在服务器端运行。

他们每次收到请求时都会启动一个 JVM(Java 虚拟机)来处理与客户端的通信。 Java servlet 可以在 JVM 内部运行,如果需要,在将响应发送回客户端之前进行一些处理。每个新请求都在 servlet 的新实例中运行。这使得处理多个并发请求更简单(不需要更复杂的线程)。

网络(向服务器发送数据和从服务器发送数据)

在联网情况下,客户端可以是 PC、Android 手机或任何其他能够连接到互联网的设备。就服务器而言,如果客户端可以使用 HTTP(它理解的标准协议)进行通信,它并不关心它是什么类型的设备。这意味着用于 PC 桌面客户端-服务器应用程序的解决方案类似于用于手机的解决方案。

您可以使用 Apache HTTP Components 等库来更轻松地处理设备和服务器之间的 HTTP 请求和响应。当然,您可以编写自己的类来使用 Sockets 来执行此操作,但这会非常耗时,尤其是如果您以前从未这样做过。

数据存储

如果您有时间,我建议您实施某种数据库来存储信息。 它们具有许多好处,例如数据恢复机制、用于快速搜索数据的索引、确保数据完整性、更好的数据结构等。 如果您决定使用数据库,我推荐MySQL。它是免费的,更重要的是 - 有据可查。

顺便说一句:JDBC 可用于使用 Java 与数据库进行通信。


抱歉,内嵌超链接 - 显然我的声望不够高,无法发布超过两个!

来源:实施类似设计的个人经验。

【讨论】:

  • 嗨莫里斯,感谢您的意见。我还没有考虑过 Apache 服务器,我只是想通过 Ant 启动我的 Java 服务器,但是因为我将在 VM 上运行它,所以 Apache 服务器可能更合适。但是有一个问题:我将使用 MySQL 数据库来存储信息,以及对包含大量数据的文件的引用(即,每个文件最多 300KB,每次传输)。我可以将其存储在 MySQL 中吗?到目前为止,我没有在 MySQL 表中存储任何内容,除了一些 long 和字符串。
  • 我不确定您是否在询问 MySQL 是否能够存储该数量的数据,或者它是否适合您的数据。在前者的情况下,数据库大小通常仅受服务器上可用磁盘空间的限制。对于第二种情况,可以存储对文件的引用以及一些数据。对文件的引用可以简单地是存储为表中字符串的原始文件的路径。如果数据是重复的(即属性相同,但值不同),那么数据库就是要走的路。我希望这更清楚一点。
  • 是的,谢谢莫里斯。至少它让我更清楚地知道我想为我的实现做什么:)
  • 最后,您对使用 HTTP 传输而不是我目前的 android 方法有意见吗?我在某处读到它是更受支持的方式。
  • 如果您上面链接的解决方案肯定是一种方法。但是,您仍然需要在服务器端处理该原始字符流。这可能就像立即将其写入文本文件一样简单。同样,与套接字一样,除非您向客户端应用程序发送回确认,否则您将无法知道是否收到了您的数据。如果是我,我仍然会使用 HTTP,因为它提供了更多功能 - 重新发送丢弃的数据包、错误处理、安全性等。但是,如果这些功能都是多余的,那么请继续使用套接字。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多