fre*_*crs 0 java sockets file transfer
我有一个问题,在我的服务器中,在我发送一个包含X字节的文件后,我发送一个字符串说这个文件结束了,另一个文件即将到来,就像
FILE: a SIZE: Y\r\n
send Y bytes
FILE a FINISHED\r\n
FILE b SIZE: Z\r\n
send Z byes
FILE b FINISHED\r\n
FILES FINISHED\r\n
Run Code Online (Sandbox Code Playgroud)
在我的客户端,它没有正确回收.在从套接字读取Y或Z字节后,我使用readline()来获取命令行.有一个文件它工作正常,多个文件很少工作(是的,我不知道它是如何工作一次或两次)
以下是我用来传输二进制文件的一些代码
public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
long size, int bufferSize) throws Exception
{
byte[] buffer = new byte[bufferSize];
long curRead = 0;
long totalRead = 0;
long sizeToRead = size;
while(totalRead < sizeToRead)
{
if(totalRead + buffer.length <= sizeToRead)
{
curRead = is.read(buffer);
}
else
{
curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
}
totalRead = totalRead + curRead;
fout.write(buffer, 0, (int) curRead);
}
}
public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
byte[] buffer = new byte[bufferSize];
int count = 0;
while((count = in.read(buffer)) != -1)
{
out.write(buffer, 0, count);
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了注意我可以解决将readline替换为此代码:
ByteArrayOutputStream ba = new ByteArrayOutputStream();
int ch;
while(true)
{
ch = is.read();
if(ch == -1)
throw new IOException("Conecção finalizada");
if(ch == 13)
{
ch = is.read();
if(ch == 10)
return new String(ba.toByteArray(), "ISO-8859-1");
else
ba.write(13);
}
ba.write(ch);
}
Run Code Online (Sandbox Code Playgroud)
PS:"是"是来自socket的输入流:socket.getInputStream();
我仍然不知道它是否是最好的实现,我试着弄明白
这里的readLine()代码中没有调用,而是回答你的问题; 是的,调用BufferedReader.readLine()可能很好地留下内部缓冲区中的东西.它正在缓冲输入.
如果你换你的一个InputStream在BufferedReader,如果从阅读你不能真正得到多少理智的行为BufferedReader,然后从后面看InputStream.
您可以从中读取字节,InputStream并通过查找一对字节来解析文本行\r\n.当你得到一行"FILE:a SIZE:Y\r \n"时,你会像往常一样继续,除了用于解析行的缓冲区可能包含文件的前几个字节,所以先写出这些字节.
或者您使用FTP的想法并使用一个TCP流来执行命令,使用一个TCP流进行实际传输,从命令流中BufferedReader.readLine(),读取并读取数据,就像您已经使用InputStream.