如何解决套接字编程文件上传问题?完整文件未上传
| 嗨,我正在使用以下代码将我的文件从android手机上传到服务器bt,文件未完全上传..e.g例如,我上传了一个ѭ0up文件,但在服务器上只有8kb
文件。我在做什么错?
客户端
Socket skt = new Socket\"112.***.*.**\",3000);
String FileName=fil.getName();
PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(skt.getoutputStream())),true);
out2.println(\"Upload\");
out2.println(FileName);
out2.println(spinindx);
out2.println(singleton.arrylst_setngs.get(0).toString());
out2.println(singleton.arrylst_setngs.get(1).toString());
out2.println(singleton.arrylst_setngs.get(2).toString());
out2.println(singleton.arrylst_setngs.get(3).toString());
out2.println(singleton.arrylst_setngs.get(4).toString());
out2.flush();
//Create a file input stream and a buffered input stream.
FileInputStream fis = new FileInputStream(fil);
BufferedInputStream in = new BufferedInputStream(fis);
bufferedoutputstream out = new bufferedoutputstream(skt.getoutputStream());
//Write the file to the server socket
int i;
byte[] buf = new byte[512];
while ((i = in.read(buf)) != -1) {
out.write(buf,i);
publishProgress(in.available());
System.out.println(i);
}
//Close the writers,readers and the socket.
in.close();
out.flush();
out.close();
out2.close();
skt.close();
}
catch( Exception e ) {
System.out.println(e);
}
服务器端
InputStream inStream = socket.getInputStream();
BufferedReader inm = new BufferedReader(new InputStreamReader(inStream));
String Request=inm.readLine();
if(Request.equals(\"Upload\")){
fileName = inm.readLine();
chosn = inm.readLine();
lt=inm.readLine();
cs = inm.readLine();
om = inm.readLine();
o = inm.readLine();
check=inm.readLine();
//Read,and write the file to the socket
BufferedInputStream in = new BufferedInputStream(inStream);
int i=0;
File f=new File(\"D:/data/\"+filePrefx+fileName);
if(!f.exists()){
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(\"D:/data/\"+filePrefx+fileName);
bufferedoutputstream out = new bufferedoutputstream(fos);
byte[] buf = new byte[512];
while ((i = in.read(buf)) != -1) {
System.out.println(i);
out.write(buf,i);
System.out.println(\"Receiving data...\");
}
in.close();
inStream.close();
out.close();
fos.close();
socket.close();
解决方法
看起来您在服务器端的同一基础套接字上同时使用BufferedReader和BufferedInputStream,并且在客户端使用两种输出流/写入器。因此,您的BufferedReader正在缓冲,这是应该做的,因此“窃取”了您希望通过BufferedInputStream读取的某些数据。道德:你不能那样做。仅使用DataInputStream和DataOutputStream,并在文件之前从客户端读取的8行中使用writeUTF()/ readUTF()。
,您在BufferedReader和bufferedInputStream之间共享了相同的基础InputStream。
发生的事情是,当您通过BufferedReader进行读取时,它会将您从基础InputStream请求的几行内容读入其自己的内部缓冲区中。并且当您创建BufferedInputStream时,该数据已经被BufferedReader读取。因此,除了EJP建议不要使用任何缓冲的类之外,还可以创建BufferedInputStream,然后在其顶部创建Reader。代码是这样的:
BufferedInputStream in = new BufferedInputStream(inStream);
Reader inm = new InputStreamReader(in);
将其添加到服务器代码的开头,并删除以下行:
BufferedInputStream in = new BufferedInputStream(inStream);
,看到这个,我从没尝试过
void read() throws IOException {
log(\"Reading from file.\");
StringBuilder text = new StringBuilder();
String NL = System.getProperty(\"line.separator\");
Scanner scanner = new Scanner(new FileInputStream(fFileName),fEncoding);
try {
while (scanner.hasNextLine()){
text.append(scanner.nextLine() + NL);
}
}
finally{
scanner.close();
}
log(\"Text read in: \" + text);
}
从无耻复制
http://www.javapractices.com/topic/TopicAction.do?Id=42
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。