【问题标题】:Transfer a byte[] via TCP Socket in android在android中通过TCP Socket传输一个字节[]
【发布时间】:2012-01-04 19:49:09
【问题描述】:

我需要通过 android -client 端的 TCP Socket 传输一个字节[]。
我尝试使用以下代码:

public static int readBytes(byte[] myByteArray) throws IOException {
    InputStream in = socket.getInputStream();
    DataInputStream dis = new DataInputStream(in);

    int len = dis.readInt(); //<-here i get the error

    byte[] data = new byte[len];
    if (len > 0) {
        dis.readFully(data,0,len);
    }
    myByteArray=data;
    return data.length;
}

但我收到以下错误:

12-23 17:30:49.814: E/AndroidRuntime(11717): java.lang.OutOfMemoryError:数组大小太大(堆大小=5699KB, 已分配=3403KB,位图大小=78KB)

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可能会在下面的行中得到OutOfMemoryError。 (使用new分配新内存的行。)

    在分配之前打印len,您可能会看到这是一个巨大的数字(比您预期的要大很多)。

    Log.d("YOU_TAG", "len = " + len);
    

    大概你没有发送发送方字节数组的大小。 (或者如果你这样做了,你的阅读/写作已经不同步了。)

    【讨论】:

    • 你是对的,我没有在服务器端发送字节数组的大小,但是整个字节数组我用 Socket.Send(byte[]) 发送数据 - 服务器端用 c# 编写(它是一个桌面应用程序)如何修改我的函数以读取整个字节 []?
    • 你不能。您需要从发送数组的长度开始。
    • 我看到c#中有一个Socket.Receive(byte[])方法,java中没有类似的方法吗?
    • 我找到了这篇关于通过套接字发送字节数组的文章:experts-exchange.com/Programming/Languages/Java/Q_21993021.html,但是我怎样才能实现这个来读取字节[]?
    • 如果您不知道发送了多少字节,那么就无法计算出您应该读取多少字节...您明白吗?
    【解决方案2】:

    你必须像这样在一个闭环中阅读:

    while(true){
    int len = dis.readInt();
    }
    

    【讨论】:

    • 我认为那是服务器端
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2012-07-12
    • 2012-02-19
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多