黑马程序员技术交流社区

标题: 在网络编程中流对象的使用问题 [打印本页]

作者: 何仕映    时间: 2013-5-28 15:57
标题: 在网络编程中流对象的使用问题
本帖最后由 何仕映 于 2013-5-28 16:10 编辑

下面这个是我一个最简单的通过TCP传输的客户端和服务端的一个小程序。为了验证流对象在网络编程中的应用,所以在尽可能的使用了流对象。

在下面这个程序中,为什么在客户端用PrintStream将数据传送到客户端,客户端再存储起来,图片就打不开了呢?如果换成原来的OutputStream,在服务端获取的图片就能正常打开?
该代码已经在下面用红字标出。请各位帅哥美女指点一下。万分感谢。
  1. import java.io.*;
  2. import java.net.*;
  3. class  Client
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 //1、建立TCP服务的服务端Socket,绑定为本机的9090端口
  8.                 Socket client = new Socket("127.0.0.1",9090);
  9.                
  10.                 //2、创建BufferedInputStream,读取要上传的文件。
  11.                 BufferedInputStream clientin =
  12.                         new BufferedInputStream(new FileInputStream(new File("F:\\合同.jpg")));

  13.                 //3、获取服务端的输出流,用来上传数据
  14.                 OutputStream clientout = client.getOutputStream();

  15.                <font color="#ff0000"> //PrintStream p = new PrintStream(clientout,true);</font><img src="http://cache.soso.com/img/img/e130.gif" smilieid="soso_e130" border="0" alt="">

  16.                 //4、读取文件并上传
  17.                 for (int i=clientin.read();i!=-1 ;i=clientin.read() )
  18.                 {
  19.                                 
  20.                         //<font color="#ff0000">clientout.write(i);</font><img src="http://cache.soso.com/img/img/e130.gif" smilieid="soso_e130" border="0" alt="">
  21.                         p.print(i);
  22.                         
  23.                 }
  24.                 //5、关闭输出流
  25.                 client.shutdownOutput();

  26.                 //6、建立BufferedReader,用来接收服务器反馈的字符
  27.                 BufferedReader clientr =
  28.                         new BufferedReader(new InputStreamReader(client.getInputStream()));

  29.                 //7、读取服务器反馈的字符信息,并打印
  30.                 for (String string=clientr.readLine(); string!=null;string=clientr.readLine())
  31.                 {
  32.                         System.out.println(string);
  33.                 }
  34.                 //8、关闭资源
  35.                 client.close();
  36.                 clientin.close();
  37.         }
  38. }








  39. class Server
  40. {
  41.         public static void main(String[] args)throws Exception
  42.         {
  43.                 //1、建立服务端的ServerSocket对象,并让其监听9090端口
  44.                 ServerSocket server = new ServerSocket(9090);
  45.                
  46.                 //2、获取连接该服务器的客户Socket
  47.                 Socket clientw = server.accept();

  48.                 //3、获取客户端的ip
  49.                 String ip = clientw.getInetAddress().getHostAddress();
  50.                 System.out.println(ip+"is connected");
  51.                
  52.                 //4、建立BufferedInputStream来读取客户端发过来的信息。
  53.                 BufferedInputStream serverin = new BufferedInputStream(clientw.getInputStream());
  54.                
  55.                 //5、建立输入流将客户端上传的数据存贮
  56.                 BufferedOutputStream serverp =
  57.                                 new BufferedOutputStream((new FileOutputStream(new File("F:\\背景音乐\\伤心男人\\合ddd同.jpg"))));
  58.                
  59.                 //建立PrintStream 使其能自动刷新
  60.                 PrintStream ps = new PrintStream(serverp,true);

  61.                 //7、读取客户端上传的东西并储存
  62.                 for (int i=serverin.read(); i!=-1;i=serverin.read() )
  63.                 {        
  64.                         ps.write(i);        
  65.                 }
  66.                         
  67.                 //8、获取输出流对象,用来给客户端反馈信息
  68.                 BufferedWriter serverb = new BufferedWriter(new OutputStreamWriter(clientw.getOutputStream()));
  69.                 PrintWriter servers = new PrintWriter(serverb,true);
  70.                 servers.println("上传成功");
  71.                
  72.                 //9、关闭该输出流,并关闭资源。
  73.                 clientw.shutdownOutput();
  74.                 serverp.close();
  75.                 clientw.close();
  76.                
  77.         }
  78. }
复制代码

作者: 无妄无涯    时间: 2013-5-28 16:03
哥们,你用错PrintStream方法了。API文档中有这么一句:“PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。”
你要传输的图片必须用字节流,图片对应的二进制数据又不是用字符编码表来解析的,否则还要图片查看器干嘛?
作者: 何仕映    时间: 2013-5-28 16:07
无妄无涯 发表于 2013-5-28 16:03
哥们,你用错PrintStream方法了。API文档中有这么一句:“PrintStream 打印的所有字符都使用平台的默认字符 ...

对哦,一个小问题纠结了几个小时。谢谢你。




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