A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在做TCP传输文件的题目时,发现服务端读取socket的输入流用BufferedInputStream包装后就会出错,直接调用s.getInputStream就没问题。这个问题耗费了我好久时间,哪位大神能给解答下?

10 个回复

倒序浏览
in=new BufferedInputStream(s.getInputStream());读取文件就会错误,大小不一样
in=s.getInputStream    这样就没问题
回复 使用道具 举报
客户端想服务端的outputStream同理,也不能用BufferedOutputStream类包装
回复 使用道具 举报
我刚刚试了一下,感觉没问题
import java.net.*;
import java.io.*;
class TCPclient2{
        public static void main(String[] args){
                Socket s=null;
                try{
                        s=new Socket(InetAddress.getLocalHost(),18888);
                }catch(UnknownHostException e1){
                        throw new RuntimeException(e1);
                }catch(IOException e2){
                        throw new RuntimeException(e2);
                }
                BufferedWriter bw=null;
                BufferedReader br=null;
                try{
                        bw=new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(s.getOutputStream())));
                }catch(IOException e3){
                        throw new RuntimeException(e3);
                }
                try{
                        br=new BufferedReader(new InputStreamReader(new BufferedInputStream(s.getInputStream())));
                }catch(IOException e4){
                        throw new RuntimeException(e4);
                }
                try{
                        bw.write("TCP客户端来了!");
                        bw.newLine();
                        bw.flush();
                        s.shutdownOutput();
                }catch(IOException e5){
                        throw new RuntimeException(e5);
                }
                String buff=null;
                try{       
                        while((buff=br.readLine())!=null)
                                System.out.println(buff);
                }catch(IOException e6){
                        throw new RuntimeException(e6);
                }
                try{
                     s.close();
                }catch(IOException e7){
                     throw new RuntimeException(e7);
                }
        }
}




import java.net.*;
import java.io.*;
class TCPserver2{
        public static void main(String[] args){
                ServerSocket ss=null;
                Socket s=null;
                try{
                        ss=new ServerSocket(18888);
                }catch(SocketException e1){
                        throw new RuntimeException(e1);
                }catch(IOException e2){
                        throw new RuntimeException(e2);
                }
                try{
                        s=ss.accept();
                }catch(IOException e3){
                        throw new RuntimeException(e3);
                }
                System.out.println("ip"+s.getLocalAddress().getHostAddress()+"......"+"已连接");
                BufferedReader br=null;
                BufferedWriter bw=null;
                try{
                        br=new BufferedReader(new InputStreamReader(new BufferedInputStream(s.getInputStream())));
                }catch(IOException e4){
                     throw new RuntimeException(e4);
                }
                try{
                        bw=new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(s.getOutputStream())));
                }catch(IOException e5){
                     throw new RuntimeException(e5);
                }
                String buff=null;
                try{
                        while((buff=br.readLine())!=null)
                                       System.out.println("ip"+s.getLocalAddress().getHostAddress()+"......"+buff);
                }catch(IOException e5){
                        throw new RuntimeException(e5);
                }
                try{
                        bw.write("服务器已连接");
                        bw.newLine();
                        bw.flush();
                }catch(IOException e6){
                        System.out.println("服务器写异常");
                        throw new RuntimeException(e6);
                }
                try{
                     s.close();
                }catch(IOException e7){
                     throw new RuntimeException(e7);
                }
                try{
                     ss.close();
                }catch(IOException e8){
                     throw new RuntimeException(e8);
                }
        }
}
回复 使用道具 举报
能不能看看代码先?
回复 使用道具 举报


  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;



  11. class ClientDemo {
  12.         public static void  main(String[] args) {
  13.                 //定义需用到的流,先赋值null
  14.                 BufferedInputStream bis=null;
  15.                 BufferedInputStream fin=null;
  16.                 //OutputStream out=null;
  17.                 BufferedOutputStream out=null;
  18.                 File f=new File("E:\\Test01.java");
  19.                
  20.                 Socket s=null;
  21.                 try{
  22.                         s=new Socket("127.0.0.1",10002);
  23.                         fin=new BufferedInputStream(new FileInputStream(f));
  24.                         bis=new BufferedInputStream(s.getInputStream());
  25.                         //out=s.getOutputStream();                        
  26.                         out=new BufferedOutputStream(s.getOutputStream());    //就是这句,用BufferedOutputStream包装后复制的文件就出错了
  27.                         byte[] buf=new byte[1024];
  28.                         int len=0;
  29.                         while((len=fin.read(buf,0,buf.length))!=-1){
  30.                                 out.write(buf, 0, len);
  31.                         }
  32.                         s.shutdownOutput();
  33.                                
  34.                 }
  35.                 catch (IOException e) {
  36.                         e.printStackTrace();
  37.                 }
  38.                 finally{
  39.                         try {
  40.                                 if(s!=null)s.close();
  41.                         }catch (IOException e) {
  42.                                 e.printStackTrace();
  43.                         }
  44.                         try{
  45.                                 if(fin!=null)fin.close();
  46.                         }catch (IOException e) {
  47.                                 e.printStackTrace();
  48.                         }
  49.                 }
  50.         }
  51. }

  52. class ServerDemo{
  53.         public static void main(String[] args) {
  54.                 //定义需用到的流,先赋值null
  55.                 InputStream in=null;
  56.                 OutputStream bos=null;
  57.                 BufferedOutputStream fout=null;
  58.                 ServerSocket ss=null;
  59.                 Socket s=null;
  60.                 try{
  61.                         ss=new ServerSocket(10002);
  62.                         s=ss.accept();
  63.                         System.out.println(s.getInetAddress().getHostAddress()+"-----已连接");
  64.                         in=s.getInputStream();
  65.                         bos=s.getOutputStream();
  66.                         File f=new File("E:\\rec.java");
  67.                         fout=new BufferedOutputStream(new FileOutputStream(f));
  68.                         byte[] buf=new byte[1024];
  69.                         int len=0;
  70.                         while((len=in.read(buf,0,buf.length))!=-1){
  71.                                 fout.write(buf,0,len);
  72.                         }
  73.                         bos.write("文件已上传至Server!".getBytes());
  74.                         System.out.println("文件已上传至Server!");
  75.                         }
  76.                 catch (IOException e) {
  77.                         e.printStackTrace();
  78.                 }
  79.                 finally{
  80.                         try{
  81.                                 if(s!=null)s.close();
  82.                         }catch (IOException e) {
  83.                                 e.printStackTrace();
  84.                         }
  85.                         try{
  86.                                 if(ss!=null)ss.close();
  87.                         }catch (IOException e) {
  88.                                 e.printStackTrace();
  89.                         }
  90.                         try{
  91.                                 if(fout!=null)fout.close();
  92.                         }catch (IOException e) {
  93.                                 e.printStackTrace();
  94.                         }
  95.                 }
  96.                
  97.         }
  98.        
  99. }
复制代码
把ClientDemo中的out用BufferedOutputString包装后复制的文件就出错了。
回复 使用道具 举报
难道是和操作文件有关?我用的字节流,包装后复制文本和图片都有问题
回复 使用道具 举报
兄弟,你没有flush()
回复 使用道具 举报

字节流不需要flush啊
回复 使用道具 举报
umbriel 发表于 2015-8-9 12:48
字节流不需要flush啊

你用的是缓冲字节流
回复 使用道具 举报
out=new BufferedOutputStream(s.getOutputStream());  改为out=new BufferedOutputStream(new OutputStreamWriter(s.getOutputStream()));    原因你的文件为字符流需要转换为字节流,才能被Socket的输出流接收,OutputStreamWriter为字符到字节的转换流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马