Java 从输入流读取的第二个数据包的数据不完整,

Java 从输入流读取的第二个数据包的数据不完整,,java,sockets,networking,tcp,Java,Sockets,Networking,Tcp,我创建了一个简单的服务器,它使用TCP接收字节,然后将它们保存到文件流中。通过多次测试,我发现收到的第一个数据包总是文件名,没有其他数据。接收到的第二个数据包只有一个字节,它是输入文本文件的第一个字母。在这之后,所有的数据包都被正确发送了,但我似乎不知道是什么把第二个数据包搞乱了。最后一个数据包似乎被写入了两次。有人能看出我做错了什么吗?以下是一个输入/输出示例: InputStream in=clntSock.getInputStream()//服务器的输入流-从客户端获取数据 OutputS

我创建了一个简单的服务器,它使用TCP接收字节,然后将它们保存到文件流中。通过多次测试,我发现收到的第一个数据包总是文件名,没有其他数据。接收到的第二个数据包只有一个字节,它是输入文本文件的第一个字母。在这之后,所有的数据包都被正确发送了,但我似乎不知道是什么把第二个数据包搞乱了。最后一个数据包似乎被写入了两次。有人能看出我做错了什么吗?以下是一个输入/输出示例:

InputStream in=clntSock.getInputStream()//服务器的输入流-从客户端获取数据
OutputStream out=clntSock.getOutputStream()//服务器的输出流—服务器向客户端发送数据
byte[]byteBuffer=新字节[BUFSIZE];
int count=in.read(byteBuffer,0,BUFSIZE);
String firstRead=新字符串(byteBuffer,0,count);
int fileNameEnd=firstRead.indexOf(“\r\n”);
字符串fileName=firstRead.substring(0,fileNameEnd);
FileOutputStream fout=新的FileOutputStream(文件名)//解压文件输出流
int contentBegin=fileNameEnd+2;
字节[]oldBuffer=Arrays.copyOfRange(byteBuffer、contentBegin、count);
int oldCount=count contentBegin;
String oldString=新字符串(byteBuffer、contentBegin、count contentBegin,“US-ASCII”);
while((count=in.read(byteBuffer,0,BUFSIZE))!=-1){//从源缓冲区读入byteBuffer,直到源数据用完为止
String newString=新字符串(byteBuffer,0,count,“US-ASCII”);
字符串组合字符串=旧字符串+新字符串;
int index=combinedString.indexOf(“--MagicStringCSE283Miami”);
如果(索引!=-1){
系统输出打印项次(“最终打印”);
字节[]组合缓冲区=concat(oldBuffer,byteBuffer);

对于(int i=0;iTCP中没有消息,也不能保证每个
read()
将返回多少数据。除非发生错误,否则只指定在阻塞模式下传输至少一个字节

这样做的后果之一是,如果不将
read()
的结果存储在变量中,对其进行测试,然后使用它来限定处理的数据量,就不可能编写正确的网络代码


你的期望是错误的。

你真的确定你获取了你收到的数据的全部内容吗

while((count = in.read(byteBuffer, 0, BUFSIZE)) != -1) { // read from origin's buffer into byteBuffer until origin is out of data
     add logic here to print count
     add logic here to print the content of the byteBuffer 
}
很有可能在你的逻辑中,你正在虐待你收到的东西,并且不知何故丢失了部分数据。
例如,你的第二个数据包,其中你声称只接收“-”,那么计数是否正好等于1?TCP可能确实如此,但你必须验证你确实在处理你接收到的所有数据。根据你的解释,我认为你在丢弃数据,而不是正确地处理它

我每次都使用count返回的整数。你的答案与这个问题毫无关系。这个假设没有错,因为我已经检查了它每次读取的内容,每次读取的内容都是相同的。答案是正确的,但你不明白流媒体是什么。因为你一直坚持如果认为TCP中有数据包,那么TCP中就没有数据包。您必须创建这样的代码,即使您接收到每个字节的数据字节,它仍然可以工作。TCP中有数据包。我知道代码必须考虑到这一点,而且确实如此。TCP中没有数据包。数据包是端到端发送和接收的。在TCP中,我们接收数据段.ref.您只需调用收到的每个数据包,但这不是正确的术语。EJP所说的。例如,不能保证“firstRead”将包含“\r\n”。如果到目前为止,你很幸运。我知道这不能保证,但这部分代码每次都能正常工作。我甚至不关心它。我会在更重要的问题解决后修复它。每次后续读/写都不会做出任何假设,第一个假设总是正确的。即使第二次读取只有一个字节,ne也不会出错xt read应该发送下一个连续数据,但它没有,我无法想象为什么会这样。在它破坏您未来的调试之前,您应该修复已知不正确的内容。此外,“收到的第二个数据包只有一个字节,它是输入文本文件的第一个字母”-好吧,这有什么问题吗?这不是违反互联网问题。问题是“P”是“古腾堡计划”的一部分。人们希望下一个数据包至少包含“r”,但它会跳过接下来的1000个单词,并在文件中的另一个段落中拾取。在这一次跳过之后,在循环的剩余迭代中不会跳过其他字符。我已检查所有数据是否正确发送。
while((count = in.read(byteBuffer, 0, BUFSIZE)) != -1) { // read from origin's buffer into byteBuffer until origin is out of data
     add logic here to print count
     add logic here to print the content of the byteBuffer 
}