java从更多线程接收并连接文件
我有个问题。我想在4个套接字中发送文件,其中每个套接字都与1个线程连接。我使用的协议是TCP。我认为当我发送文件时,我会以良好的顺序在套接字上发送它。但我在接收字节并尝试将其连接到文件的一侧遇到了问题。 这是我从套接字接收字节的线程代码java从更多线程接收并连接文件,java,multithreading,Java,Multithreading,我有个问题。我想在4个套接字中发送文件,其中每个套接字都与1个线程连接。我使用的协议是TCP。我认为当我发送文件时,我会以良好的顺序在套接字上发送它。但我在接收字节并尝试将其连接到文件的一侧遇到了问题。 这是我从套接字接收字节的线程代码 long i = fromIdx; //file.seek(fromIdx); while (i < fromIdx+partLen) { int arrSize = ((i + 1000 >
long i = fromIdx;
//file.seek(fromIdx);
while (i < fromIdx+partLen) {
int arrSize = ((i + 1000 > fromIdx+partLen) ? (int)(fromIdx+partLen-i) : 1000);
byte[] data = new byte[arrSize];
input.read(data);
synchronized(file) {
System.out.println(i);
file.seek(i);
file.write(data);
//fromIdx = file.getFilePointer();
i += arrSize;
}
}
long i=fromIdx;
//seek文件(fromIdx);
而(ifromIdx+partLen)?(int)(fromIdx+partLen-i):1000);
字节[]数据=新字节[arrSize];
输入、读取(数据);
已同步(文件){
系统输出打印LN(i);
文件.seek(i);
文件写入(数据);
//fromIdx=file.getFilePointer();
i+=面积;
}
}
文件的类型为RandomAccessFile。主要问题是结果中的某些字节是零。我认为其他的都很好。我真的不知道问题出在哪里。当seek将文件指针设置在不应该的位置时,可能会出现一些同步问题,但我真的不知道
非常感谢您从以下文档中提供的答案:
从输入流读取多达len字节的数据到
字节。尝试读取多达len字节的数据,但读取的字节数较小
数字可以读取。实际读取的字节数返回为
整数
您应该始终选择chceck返回值
read
,因为不能保证(对于TCP套接字,甚至不是典型的)读取预期的字节数。您确定每次读取都返回预期的字节数吗?在TCP的情况下,这是不保证的(甚至是典型的)。始终检查read
的返回值。工作正常!谢谢,我也有同样的问题,伙计,使用DataInputStream#readFully(byte[]arr)
确保它填充数组并返回,或者在EOS时出现异常,或者没有足够的数据可用。我将我的评论转化为答案。