黑马程序员技术交流社区

标题: 代码问题请教? [打印本页]

作者: Friends★    时间: 2012-7-15 16:20
标题: 代码问题请教?
我写了一个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();
        }
}





作者: 陆强强    时间: 2012-7-15 16:59
本帖最后由 陆强强 于 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();
                                
        }
}


作者: 温少邦    时间: 2012-7-15 17:00
主要有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();


作者: Friends★    时间: 2012-7-15 17:30
陆强强 发表于 2012-7-15 16:59
class PicClientDemo
{
        public static void main(String[] args) throws IOException

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

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

吗?
作者: 陆强强    时间: 2012-7-15 18:03
本帖最后由 陆强强 于 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();
                                
        }
}
作者: Friends★    时间: 2012-7-15 18:26
陆强强 发表于 2012-7-15 18:03
把有几个流都换成字节流

  class PicClientDemo

好的,谢谢了
作者: 黄昆    时间: 2012-7-15 20:11
/*
客户端
*/
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();
         }
}




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