有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将字符串从Java发送到C(socket)

我正在尝试使用C从Java客户机向C服务器发送一些字符串。 首先,我发送字符串的长度。然后,我在C中手动分配内存 最后我一个字符一个字符地发送字符串

问题是,有时我得到正确的字符串,有时我得到整个字符串+额外的其他未知字符(就像我分配的比我得到的更多)

以下是Java代码:

protected void send(String data){
    short dataLength=(short)data.length();
    try {
        out.write(dataLength);
    for (int i=0; i<data.getBytes().length ;i++)
    {
        out.write(data.getBytes()[i]);
    }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

下面是C代码:

void read4(int sock, int *data)
{

    char dataRecv;
    char* memoireAllouee=NULL;
    int stringLength;
    int i=0;
    recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
    *data = dataRecv;
    stringLength=dataRecv;
    memoireAllouee=malloc(sizeof(char)*stringLength);
    if (memoireAllouee==NULL)
    {
        exit(0);
    }
    for (i=0;i<stringLength;i++)
    {
        recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
        *data = dataRecv;
        memoireAllouee[i]=dataRecv;
    }
    printf("\n\n%d\n\n\n",stringLength);
    printf("\n%s\n",memoireAllouee);
}

如果你也认为这个方法不是最优的,你能帮我找一个更快的方法吗


共 (2) 个答案

  1. # 1 楼答案

    回答你的第二个问题:

    for (int i=0; i<data.getBytes().length ;i++)
    {
        out.write(data.getBytes()[i]);
    }
    

    应该是:

    out.write(data.getBytes());
    

    for (i=0;i<stringLength;i++)
    {
        recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
        *data = dataRecv;
        memoireAllouee[i]=dataRecv;
    }
    

    应该是:

    int offset= 0;
    while (offset < stringLength)
    {
        int count = recv(sock, &memoireAllouee[offset], stringLength-offset 0) ;
        if (count == 0)
            // premature EOS .. do something
            break;
        if (count == -1)
            // Error ... do something
            break;
        offset += count;
    }
    
  2. # 2 楼答案

    protected void send(String data){
        short dataLength=(short)data.length();
        try {
            out.write(dataLength);
        for (int i=0; i<data.getBytes().length ;i++)
        {
            out.write(data.getBytes()[i]);
        }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
    

    首先,您要为每个字符重新计算整个getBytes()数组两次。将byte[]保存到变量byteArray中,并使用您使其花费二次时间的方法,这完全是不必要的。另外,为什么不直接调用out.write(byteArray),而不是执行for循环呢

    其次,data.length()并不总是等于data.getBytes().length()。确保你写的是byteArray.length,而不是仅仅data.length()

    最后,确保在两端使用一致的字符集。字符串到字节数组的映射在很大程度上依赖于Charset,因此请确保两侧的Charset相同,以免遇到编码问题