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

use*_*561 3 c java sockets tcp

我正在尝试使用C将一些字符串从A 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();
    }       
}
Run Code Online (Sandbox Code Playgroud)

这是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);
}
Run Code Online (Sandbox Code Playgroud)

如果你认为这种方法不是最优的,你可以帮助我加快速度吗?

Lou*_*man 9

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();
    }       
}
Run Code Online (Sandbox Code Playgroud)

对于初学者,你要为每个角色重新计算整个getBytes()数组两次.保存到一个变量并使用它 - 你正在使这需要二次时间,完全不必要.另外,为什么不直接调用,而不是循环?byte[]byteArrayout.write(byteArray)for

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

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