【问题标题】:Sending 1 MB Buffer of data over Socket in Android在 Android 中通过 Socket 发送 1 MB 数据缓冲区
【发布时间】:2015-10-21 17:57:14
【问题描述】:

如何在 java 中通过套接字发送长度为 1 MB 的数据缓冲区。 我到底在做什么是我想计算网络的上传速度。为此我想向我用 C 编写的服务器发送 1 MB 数据。

在 C 中接收和发送数据,我们有类似 send and recv 的函数,通过它我们可以通过传递要发送的字节数来发送所需的字节数。

send(connfd , client_message , `Bytes to send`, 0);

但在 java 中,我一次只能发送 1 个字节

int buffer[] = new int[1048576];
PrintWriter output1 = new PrintWriter(socket.getOutputStream(), true);
output1.print(buffer[1]);

所以要发送多个字节,我需要一次又一次地调用上述函数。有什么方法可以让我随时传递 1048576 的整个缓冲区。

【问题讨论】:

  • 试试 java.nio 包
  • byte[] array = new byte[ 1 * 1024 * 1024]; OutputStream os = socket.getOuputStream(); os.write(array); os.flush(); os.close();
  • 我认为有一个小错误:您的缓冲区将包含 4MB 的数据,因为您有 1024*1024 个 int,而一个 int 本身占用 4byte。

标签: java android sockets


【解决方案1】:

您的PrintWriter 有一个print(char[] s) 方法(see doc)。因此,您可以改为创建一个具有相应大小的新 char 数组(注意:Java 中的 char 是 2 字节长)并使用该方法发送该 char 数组。

但是有一个更好的选择:查看the doc 告诉我们我们从我们的套接字中获得了一个OutputStream。我们可以将其包装成BufferedOutputStream,如下所示:

BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte buffer[] = new byte[1024*1024];
bos.write(buffer, 0, buffer.length);

然后使用bos.write(byte[], int, int)直接发送一个字节数组,这可能是实现你想要的最直接的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 2011-08-01
    • 2015-10-29
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多