将字符串从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);
}
如果你也认为这个方法不是最优的,你能帮我找一个更快的方法吗
# 1 楼答案
回答你的第二个问题:
应该是:
及
应该是:
# 2 楼答案
首先,您要为每个字符重新计算整个
getBytes()
数组两次。将byte[]
保存到变量byteArray
中,并使用您使其花费二次时间的方法,这完全是不必要的。另外,为什么不直接调用out.write(byteArray)
,而不是执行for
循环呢其次,
data.length()
并不总是等于data.getBytes().length()
。确保你写的是byteArray.length
,而不是仅仅data.length()
最后,确保在两端使用一致的字符集。字符串到字节数组的映射在很大程度上依赖于
Charset
,因此请确保两侧的Charset
相同,以免遇到编码问题