Java 通过WIFI进行高速文件传输

Java 通过WIFI进行高速文件传输,java,android,sockets,Java,Android,Sockets,各位。我是网络编程的初学者。目前,我想做一个实验,从Android手机向Ubuntu服务器发送一个文件(~2M字节)。如何以最高速度发送?我尝试过在Java中使用Bufferedreader,读取文件中的每个字节,并通过套接字“outputstream write”函数将单个字节发送到服务器。这种方式似乎花费了太多的时间。我注意到,如果在相同的网络条件下,我使用一些即时通讯工具(如Skype)发送相同的文件;它比我快多了。有人知道即时通讯软件下面的API或实现协议吗 我可能需要调用socket以

各位。我是网络编程的初学者。目前,我想做一个实验,从Android手机向Ubuntu服务器发送一个文件(~2M字节)。如何以最高速度发送?我尝试过在Java中使用Bufferedreader,读取文件中的每个字节,并通过套接字“outputstream write”函数将单个字节发送到服务器。这种方式似乎花费了太多的时间。我注意到,如果在相同的网络条件下,我使用一些即时通讯工具(如Skype)发送相同的文件;它比我快多了。有人知道即时通讯软件下面的API或实现协议吗


我可能需要调用socket以外的其他高效API?我还试图将整个文件读入一个字节数组,然后调用“socket write”函数将这个巨大的字节数组发送到服务器上,只需一次。虽然当我在服务器端接收到它时,发现在我的原始数据中分布了大量的“填充零”,但整个传输过程似乎花费的时间比“单字节传输”方法。有人对此有什么建议吗?非常感谢!

除了重新发明TCP/IP之外,最快的发送方式将是通过UDP,前提是您的连接足够好(几乎没有丢失)因此,您需要实现数据包序列,以便发送方将序列号预先添加到数据包中,接收方跟踪丢失的数据包,并在发送所有数据后再次请求。在接收到所有数据后,接收方可以重新组装完整的文件


这是TCP over UDP的简单实现。

谢谢大家的回答。我想我犯了一个愚蠢的错误。我使用TCP套接字传输速度慢的真正原因是每次我只是从文件中读取一个字节并调用“void write(int b)”“将此单字节发送到服务器。此方法非常耗时。现在,每次我试图从文件中读取256个字节,并通过“无效写入(byte[]b,int off,int len)”发送这256个字节时;这样,传输速度非常快。因此,这不是TCP本身的问题。调用错误的API是我的错误。我还没有试过UDP。但我认为这也是一个很好的选择。再次感谢大家。

您能提供一些API吗?我可以在Android中搜索和使用它。非常感谢。没有额外的API。这是DatagramSocket套接字连接,你说的“填充零”毫无意义。您应该遵守任何读取返回的值,而不是缓冲区的大小。如果这样做,例如
bRead=socket.read(buffer,0,sizeof(buffer))然后您应该将面包字节写入文件,而不是缓冲区的大小。