本人使用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));)它们应该用的是同一个缓冲区,请高手告知原由,小弟百拜。

解决方案 »

  1.   

    你只是把同一个socket包装成不同的输入输出流,这样做实际上没有什么意义
    建议你接受和发送消息时候不要包装,接受文件时候包装成对象输入输出流即可
    这里是我完成的例子程序:http://edinkysoft.appspot.com/jsp/articles/javafilesocket.html
      

  2.   

    java有很多成熟的框架,开源免费,不用自己去开发的,比如:netty,mina,如果你自己想学习的话,可以直接读一下源码。
      

  3.   

    谢了,我也是头一回用java写SOCKET
      

  4.   

    你只是包装了socket 未进行io操作