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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Friends★ 中级黑马   /  2012-7-15 16:20  /  1616 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我写了一个Tcp上传图片的例子,可是就是有问题,请各位帮我看看是哪里出问题了!

/*
客户端
*/
import java.io.*;
import java.net.*;
class PicClientDemo
{
        public static void main(String[] args) throws IOException
        {
                //建立Socket服务
                Socket s=new Socket("127.0.0.1",10010);
                FileInputStream fis=new FileInputStream("f:\\11.jpg");
       
                //把文件写出去
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
       
                int len=0;
                byte[] by=new byte[1024];
                while((len=fis.read(by))!=-1){
                        pw.println(new String(by,0,len));
                }
                s.shutdownOutput();
                //得到服务端的回馈信息
                BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str=bufr.readLine();
                System.out.println(str);
                fis.close();
                s.close();


        }
}

/*
服务端
*/
import java.io.*;
import java.net.*;
class  PicServerDemo
{
        public static void main(String[] args) throws IOException
        {
                //建立ServerSocket服务
                ServerSocket ss=new ServerSocket(10010);
                Socket s=ss.accept();
                //然后就是得到数据
                BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                //把文件放到指定的地方
                PrintWriter pw=new PrintWriter(new FileWriter("f:\\"),true);
                String line=null;
                while((line=bufr.readLine())!=null){
                        pw.println(line);
                }
                //然后就是给客户端回复一个信息
                //也就是把信息写出去
                BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                bufw.write("上传成功");
                pw.close();
        }
}




评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 陆强强 于 2012-7-15 17:05 编辑

class PicClientDemo
{
        public static void main(String[] args) throws IOException
        {
              
                Socket s=new Socket("192.168.0.171",10010);
                FileInputStream fis=new FileInputStream("d:\\11.jpg");
        
               
                PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        
                int len=0;
                byte[] by=new byte[1024];
                while((len=fis.read(by))!=-1){
                        pw.println(len);//PrintWriter很强大不需要new String
                }
                s.shutdownOutput();
               
                BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str=bufr.readLine();
                System.out.println(str);
                fis.close();
                s.close();


        }
}


class  PicServerDemo
{
        public static void main(String[] args) throws IOException
        {
               
                ServerSocket ss=new ServerSocket(10010);
                Socket s=ss.accept();
               
                BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                PrintWriter pw=new PrintWriter(new FileWriter("e:\\ertrt.jpg"),true);//这里要指明存储的文件类型,也就是创建一个空jpg文件
                String line=null;
                while((line=bufr.readLine())!=null){
                        pw.println(line);
                }
               
               pw = new PrintWriter(s.getOutputStream(),true);//这里用PrintWriter
                                pw.println("上传成功");
               
                                pw.close();
                                
        }
}

回复 使用道具 举报
主要有3个问题,修改即可运行成功

1.图片的传输用字节流

2.接受端创建OutputStream时,也要指定一个文件名,
PrintWriter pw=new PrintWriter(new FileWriter("f:\\"),true);
这样只指定一个目录是不行的,
应该像这样:
FileOutputStream fos=new FileOutputStream("f:\\11.jpg");

3.服务端返回上传成功的信息时,
bufw.write("上传成功");
因为用的是BufferedWriter
所以后面要加这2句:
bufw.newLine();
bufw.flush();

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
陆强强 发表于 2012-7-15 16:59
class PicClientDemo
{
        public static void main(String[] args) throws IOException

呵呵……再追问一句,就是我按你说的改了,已经上传

了,现在就是上传的图片不完整,是怎么回事?你知道

吗?
回复 使用道具 举报
本帖最后由 陆强强 于 2012-7-15 18:23 编辑
Friends★ 发表于 2012-7-15 17:30
呵呵……再追问一句,就是我按你说的改了,已经上传

了,现在就是上传的图片不完整,是怎么回事?你知道 ...
把有几个流都换成字节流

  class PicClientDemo
{
        public static void main(String[] args) throws IOException
        {
              
                Socket s=new Socket("192.168.0.171",10010);
                FileInputStream fis=new FileInputStream("d:\\11.jpg");
        
               
                BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
        
                int len=0;
                byte[] by=new byte[1024];
                while((len=fis.read(by))!=-1){
                        bos.write(by,0,len);
                                                bos.flush();
                }
                s.shutdownOutput();
               
                BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
//换成字节流
                String str=bufr.readLine();
                System.out.println(str);
                fis.close();
                s.close();


        }
}


class  PicServerDemo
{
        public static void main(String[] args) throws IOException
        {
               
                ServerSocket ss=new ServerSocket(10010);
                Socket s=ss.accept();
               
                BufferedInputStream bufr=new BufferedInputStream(s.getInputStream());
               
                BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("e:\\ertrt.jpg"));//读取和写入都换成字节流
                int line=0;
                                
                while((line=bufr.read())!=-1){
                        bos.write(line);
                bos.flush();
                }
               
              PrintWriter pw = new PrintWriter(s.getOutputStream(),true);//这里用PrintWriter
                                pw.println("上传成功");
               
                                pw.close();
                                
        }
}
回复 使用道具 举报
陆强强 发表于 2012-7-15 18:03
把有几个流都换成字节流

  class PicClientDemo

好的,谢谢了
回复 使用道具 举报
黄昆 中级黑马 2012-7-15 20:11:32
7#
/*
客户端
*/
import java.io.*;
import java.net.*;
class PicClientDemo
{
         public static void main(String[] args) throws IOException
         {
                 //建立Socket服务
                 Socket s=new Socket("127.0.0.1",10010);
                 FileInputStream fis=new FileInputStream("f:\\11.jpg");
         
                //把文件写出去,图片文件是非文本数据应该使用字节流呀,把此处的PrintWriter换成OutputStream
                 PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
         
                int len=0;
                 byte[] by=new byte[1024];
                 while((len=fis.read(by))!=-1){
                         pw.println(new String(by,0,len));
                 }
                 s.shutdownOutput();
                 //得到服务端的回馈信息
                 BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                 String str=bufr.readLine();
                 System.out.println(str);
                 fis.close();
                 s.close();


        }
}

/*
服务端
*/
import java.io.*;
import java.net.*;
class  PicServerDemo
{
         public static void main(String[] args) throws IOException
         {
                 //建立ServerSocket服务
                 ServerSocket ss=new ServerSocket(10010);
                 Socket s=ss.accept();
                 //然后就是得到数据
                 BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                 //把文件放到指定的地方 图片文件是非文本数据应该使用字节流呀,把此处的PrintWriter换成FileOutputStream
                 PrintWriter pw=new PrintWriter(new FileWriter("f:\\"),true);
                 String line=null;
                 while((line=bufr.readLine())!=null){
                         pw.println(line);
                 }
                 //然后就是给客户端回复一个信息
                 //也就是把信息写出去
                 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                 bufw.write("上传成功");
                 pw.close();
         }
}
我帮你把代码修改了一下

/*
客户端
*/
import java.io.*;
import java.net.*;
class PicClientDemo
{
         public static void main(String[] args) throws IOException
         {
                 //建立Socket服务
                 Socket s=new Socket("127.0.0.1",10010);
                 FileInputStream fis=new FileInputStream("f:\\11.jpg");
         
                //把文件写出去
                 OutputStream out = s.getOutputStream();

         
                int len=0;
                 byte[] by=new byte[1024];
                 while((len=fis.read(by))!=-1){
                         out.write(by,o,len);
                 }
                 s.shutdownOutput();
                 //得到服务端的回馈信息
                 BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                 String str=bufr.readLine();
                 System.out.println(str);
                 fis.close();
                 s.close();


        }
}

/*
服务端
*/
import java.io.*;
import java.net.*;
class  PicServerDemo
{
         public static void main(String[] args) throws IOException
         {
                 //建立ServerSocket服务
                 ServerSocket ss=new ServerSocket(10010);
                 Socket s=ss.accept();
                 //然后就是得到数据
                 BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
                 //把文件放到指定的地方 图片文件是非文本数据应该使用字节流呀,把此处的PrintWriter换成FileOutputStream
                 BufferedWriter bufin=new BufferedWriter (new OutputStreamWriter(new FileOutputStream("f:\\copy11.jpg")));
                 String line=null;
                 while((line=bufr.readLine())!=null){
                        bufin.write(line);
                 }
                 //然后就是给客户端回复一个信息
                 //也就是把信息写出去
                 BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                 bufw.write("上传成功");
                 bufin.close();
         }
}

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马