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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 应佳锋 中级黑马   /  2012-4-8 10:17  /  2296 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args) {
  try {
        Socket s=new Socket("192.168.1.102",10003);
           java.io.OutputStream os= s.getOutputStream();
       
           BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\ssh\\artifacts.xml"));
           System.out.println(bis.available());
              byte[] b=new byte[bis.available()];
            int count=  bis.read(b);
            System.out.println("把数据存储到数组完毕"+count);
            os.write(b);
             s.close();
} catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}
  
     
  

        }
以上为客户机 发送文件过去

try {
                ServerSocket ss=new ServerSocket(10003);
  Socket s=                ss.accept();
     InputStream is= s.getInputStream();
     System.out.println(is.available());//这里无法得到文件的大小有时候发送字符串的时候 偶尔能接收到长度 有时候也接受不到
       byte[] b=new byte[55555];
       int a= is.read(b);
         BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("d:/bb.XML"));
         System.out.println(a);
         bos.write(b);
         bos.close();
       ss.close();
               
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
         
以上为客户端
问题1:发送的数据服务端的is.available()方法为什么有时候接受不到发送的数据或者文件大小
问题2:为什么不能传输大文件 比如50M左右的文件



问题1:客户端

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

5 个回复

倒序浏览
is.avalilable()方法有时候接受不到发送数据的大小或者文件时因为,他根本就没有接受到数据,所以
System.out.println(bis.available());
不会有打印结果
回复 使用道具 举报
本帖最后由 曾晓文 于 2012-4-8 10:33 编辑

客户端没有把 bis中的 缓冲区数据刷到网络输出流去。
           BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\ssh\\artifacts.xml"));
           System.out.println(bis.available());
              byte[] b=new byte[bis.available()];
            int count=  bis.read(b);
            System.out.println("把数据存储到数组完毕"+count);
            os.write(b);
            bis.flush();//此句可以不用写,因为下面的 bis.close(); 有刷新的功能。
            bis.close();
            os.close();
            s.close();
回复 使用道具 举报
本帖最后由 曾晓文 于 2012-4-8 10:42 编辑

用tcp协议可以一次传输50M的数据,不过这样有点耗资源,你必须的申请一个50M的缓冲区来存这50M数据,存完再写到输出流(网络输出流)。available方法慎用,它会根据你传输的文件大小申请一个刚刚好的内存。如果文件过大,会把你的电脑,搞崩溃的。
回复 使用道具 举报
问题解决了 也理解了机制了
回复 使用道具 举报
 楼主的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有楼主这样长相秉异和有着完美男人气质的人,才能作为这真理的唯一引言者。看了楼主的帖子,让我陷入了严肃的思考中,我认为,如果不把楼主的帖子顶上去,就是对美丽的一种误解,就是对丑陋的极大妥协。因此,我决定义无返顾的顶了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马