本人使用java socket进行文件传输,但始终有个问题无法解决。
我在客户端和服务端都实现如下4个类://传输文件用
BufferedInputStream socket_bis=new BufferedInputStream(in);
BufferedOutputStream socket_bos=new BufferedOutputStream(out);
//传输字符串命令用
BufferedReader socket_br=new BufferedReader(new InputStreamReader(socket_bis));
PrintWriter socket_pw=new PrintWriter(new OutputStreamWriter(socket_bos),true);其中in和out为:InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();我先用 socket_br和socket_pw在客户端和服务器端进行字符串命令交互,交互完后客户端传输文件给服务端
客户端传输文件的代码为:socket_pw.println("file:"+encrypt_filename);
BufferedInputStream file_bin=new BufferedInputStream(new FileInputStream(
new File(SysInfo.RECVFILES_PATH+encrypt_filename)));
while((len=file_bin.read(message))!=-1){
socket_bos.write(message, 0, len);
}
socket_bout.flush();
file_bin.close();我是用socket_bos传文件内容,按理服务端用socket_bis接收,但是我用socket_bis.available()//返回0,说明socket_bis的缓冲区中没有数据
socket_br.ready()//返回true,说明socket_br的缓冲区中有数据我用socket_br接收数据发现时文件中的内容,为什么传输的数据缓冲在服务端socket_br的缓冲区而不是socket_bis的缓冲区。按理socket_br的实例化用到了socket_bis(BufferedReader socket_br=new BufferedReader(new InputStreamReader(socket_bis));)它们应该用的是同一个缓冲区,请高手告知原由,小弟百拜。
我在客户端和服务端都实现如下4个类://传输文件用
BufferedInputStream socket_bis=new BufferedInputStream(in);
BufferedOutputStream socket_bos=new BufferedOutputStream(out);
//传输字符串命令用
BufferedReader socket_br=new BufferedReader(new InputStreamReader(socket_bis));
PrintWriter socket_pw=new PrintWriter(new OutputStreamWriter(socket_bos),true);其中in和out为:InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();我先用 socket_br和socket_pw在客户端和服务器端进行字符串命令交互,交互完后客户端传输文件给服务端
客户端传输文件的代码为:socket_pw.println("file:"+encrypt_filename);
BufferedInputStream file_bin=new BufferedInputStream(new FileInputStream(
new File(SysInfo.RECVFILES_PATH+encrypt_filename)));
while((len=file_bin.read(message))!=-1){
socket_bos.write(message, 0, len);
}
socket_bout.flush();
file_bin.close();我是用socket_bos传文件内容,按理服务端用socket_bis接收,但是我用socket_bis.available()//返回0,说明socket_bis的缓冲区中没有数据
socket_br.ready()//返回true,说明socket_br的缓冲区中有数据我用socket_br接收数据发现时文件中的内容,为什么传输的数据缓冲在服务端socket_br的缓冲区而不是socket_bis的缓冲区。按理socket_br的实例化用到了socket_bis(BufferedReader socket_br=new BufferedReader(new InputStreamReader(socket_bis));)它们应该用的是同一个缓冲区,请高手告知原由,小弟百拜。
建议你接受和发送消息时候不要包装,接受文件时候包装成对象输入输出流即可
这里是我完成的例子程序:http://edinkysoft.appspot.com/jsp/articles/javafilesocket.html