gpt4 book ai didi

java - 保证TCP客户端和服务器之间不丢包

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:35 25 4
gpt4 key购买 nike

我正在编写一个 Java TCP 客户端,它将数据 block 发送到 C 服务器。客户端-服务器在我的开发 PC 上运行良好。此代码在硬件板上部署时显示数据包丢失。我只有日志,我知道服务器没有收到所有数据包。我没有要测试的硬件。因此,在第一级,我想非常确定客户端代码确实发送了所有需要的数据。

这是我的代码(Java 中的客户端部分)。我如何确保完成此操作?是否有一些带有计时等的重新发送命令?

        Socket mySocket = new Socket("10.0.0.2",2800);
OutputStream os = mySocket.getOutputStream();

System.out.println(" Sending 8 byte Header Msg with length of following data to Server");
os.write(hdr, 0, 8);
os.flush();

System.out.println(" Sending Data ");
start = 0;
for(int index=0; index < ((rbuffer.length/chucksize)+1); index++){
if(start + chucksize > rbuffer.length) {
System.arraycopy(rbuffer, start, val, 0, rbuffer.length - start);
} else {
System.arraycopy(rbuffer, start, val, 0, chucksize);
}
start += chucksize ;

os.write(val,0,chucksize);
os.flush();
}

这是接收此数据的 C 代码片段:

while ((bytes_received = recv(connected, rMsg, sizeof(rMsg),0)) > 0){

if (bytes_received > 0) // zero indicates end of transmission */
{
/* get length of message (2 bytes) */
tmpVal = 0;
tmpVal |= rMsg[idx++];
tmpVal = tmpVal << 8;
tmpVal |= rMsg[idx++];
msg_len = tmpVal;

len = msg_len;
//printf("msg_len = %d\n", len);
printf("length of following message from header message : %d\n", len);
char echoBuffer[RCVBUFSIZE] ;
memset(echoBuffer, 0, RCVBUFSIZE);
int recvMsgsize = 0;

plain=(char *)malloc(len+1);
if (!plain)
{
fprintf(stderr, "Memory error!");
}
for( i = RCVBUFSIZE; i < (len+RCVBUFSIZE); i=i+RCVBUFSIZE){
if(i>=len){
recvMsgSize = recv(connected, echoBuffer, (len - (i-RCVBUFSIZE)), 0);
memcpy(&plain[k], echoBuffer, recvMsgSize);
k = k+recvMsgSize;
}
else{
recvMsgSize = recv(connected, echoBuffer, RCVBUFSIZE, 0);
memcpy(&plain[k], echoBuffer, recvMsgSize);
k = k+recvMsgSize;
}
}
}//closing if
}//closing while

最佳答案

首先,TCP/IP 中不存在丢包这回事。该协议(protocol)旨在以正确的顺序可靠地发送字节流。所以问题一定出在您的应用程序或另一方。

我真的没有心情分析整个 arraycopy() 疯狂(C 任何人?),但你为什么不直接发送整个 rbuffer一个通过 BufferedOutputStream?

OutputStream os = new BufferedOutputStream(mySocket.getOutputStream());

然后:

os.write(rbuffer);

相信我,BufferedOutputStream 正在做完全相同的事情(将字节收集成 block 并一次性发送)。还是我遗漏了什么?

关于java - 保证TCP客户端和服务器之间不丢包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7431175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com