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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 湛添友 中级黑马   /  2014-4-27 10:23  /  839 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//为什么图片只上传了1KB
package net;
/*
* 使用 Tcp传输协议 上传图片
*/
import java.io.*;
import java.net.*;
public class PicturesDemo
{
        public static void main(String args[])throws Exception
        {
                Socket s=new Socket("192.168.1.8",16655);
               
                BufferedInputStream bisFile=new BufferedInputStream(new FileInputStream("D:\\abc\\IMG_0001 (2).JPG"));
               
                BufferedReader bis=new BufferedReader(new InputStreamReader((s.getInputStream())));
                BufferedOutputStream bws=new BufferedOutputStream(s.getOutputStream());
               
                int len=0;
                while((len=bisFile.read())!=-1);
                {
                        bws.write(len);
                        bws.flush();
                }
                s.shutdownOutput();
                System.out.println(bis.readLine());
               
                bisFile.close();
                s.close();
        }
}

class Server4
{
        public static void main(String args[]) throws Exception
        {
                ServerSocket ss=new ServerSocket(16655);
                Socket s=ss.accept();
                String ip=s.getInetAddress().getHostAddress();
               
                System.out.println(ip+"conec");
                BufferedOutputStream bwsFile=new BufferedOutputStream(new FileOutputStream("D:\\abc\\IMG.JPG"));
               
                BufferedInputStream bis=new BufferedInputStream(s.getInputStream());
                BufferedOutputStream bws=new BufferedOutputStream(s.getOutputStream());
                //byte[] buf=new byte[1024*1024];
                int len=0;
                while((len=bis.read())!=-1)
                {
                        bwsFile.write(len);
                        bwsFile.flush();
                }
                bws.write("图片已上传\r\n".getBytes());
                bws.flush();
               
                bwsFile.close();
                s.close();
                ss.close();
        }
}














2 个回复

倒序浏览
我认为应该是: while((len=bisFile.read())!=-1); 这句话中bisFile.read()有可能出问题,你看了毕老师的复制mp3的视频讲解就知道,由于图片在内存中使用的是二进制数据存储的,这里的read方法就有可能读取到某一部分就读取到了连续的11111111时转换成int型的就编程-1,此时就跳出了while循环,所以读取不到整个文件。同理,在server类中 while((len=bis.read())!=-1)也可能出现这种情况。你用数组读取就应该没有这种问题了。
  1. import java.net.*;
  2. import java.io.*;

  3. class PicClient
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s = new Socket("192.168.1.120",10086);

  8.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\1.jpg"));
  9.                 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  10.                 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
  11.                
  12.                 byte[] buf = new byte[1024];
  13.                 int len = 0;
  14.                 while((len=bis.read(buf))!=-1)
  15.                 {
  16.                         bos.write(buf,0,len);
  17.                         bos.flush();
  18.                 }
  19.                 s.shutdownOutput();

  20.                 String line = br.readLine();
  21.                 System.out.println(line);

  22.                 bis.close();
  23.                 bos.close();
  24.                 br.close();
  25.                 s.close();
  26.         }
  27. }
复制代码
  1. package com.itheima.test;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedWriter;
  5. import java.io.FileOutputStream;
  6. import java.io.OutputStreamWriter;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;

  9. public class PicServer {

  10.         public static void main(String[] args) throws Exception {

  11.                 ServerSocket ss = new ServerSocket(10086);
  12.                 Socket s = ss.accept();
  13.                
  14.                 BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
  15.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://2.jpg"));
  16.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  17.                
  18.                 byte[] buf = new byte[1024];
  19.                 int len = 0;
  20.                 while((len=bis.read(buf))!=-1){
  21.                         bos.write(buf,0,len);
  22.                         bos.flush();
  23.                 }
  24.                
  25.                 bw.write("上传成功!!!");
  26.                 bw.flush();
  27.                
  28.                 bis.close();
  29.                 bos.close();
  30.                 bw.close();
  31.                 s.close();
  32.                 ss.close();

  33.         }

  34. }
复制代码



回复 使用道具 举报
松毛 发表于 2014-4-27 11:38
我认为应该是: while((len=bisFile.read())!=-1); 这句话中bisFile.read()有可能出问题,你看了毕老师的复 ...

BufferedInputStream内部不是&上了 255   就算是1111111 len这是也是00000000000000000000000011111111吗??  应该不会出现这样的问题啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马