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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何仕映 中级黑马   /  2013-5-28 15:57  /  1033 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何仕映 于 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. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2

查看全部评分

2 个回复

倒序浏览
哥们,你用错PrintStream方法了。API文档中有这么一句:“PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。”
你要传输的图片必须用字节流,图片对应的二进制数据又不是用字符编码表来解析的,否则还要图片查看器干嘛?

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 很给力!
何仕映 + 3 赞一个!

查看全部评分

回复 使用道具 举报
无妄无涯 发表于 2013-5-28 16:03
哥们,你用错PrintStream方法了。API文档中有这么一句:“PrintStream 打印的所有字符都使用平台的默认字符 ...

对哦,一个小问题纠结了几个小时。谢谢你。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马