黑马程序员技术交流社区

标题: 网络编程问题 高手进 [打印本页]

作者: 应佳锋    时间: 2012-4-8 10:17
标题: 网络编程问题 高手进
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:客户端
作者: 邓海涛    时间: 2012-4-8 10:22
is.avalilable()方法有时候接受不到发送数据的大小或者文件时因为,他根本就没有接受到数据,所以
System.out.println(bis.available());
不会有打印结果
作者: 曾晓文    时间: 2012-4-8 10:30
本帖最后由 曾晓文 于 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:39
本帖最后由 曾晓文 于 2012-4-8 10:42 编辑

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2