黑马程序员技术交流社区
标题:
在网络编程中流对象的使用问题
[打印本页]
作者:
何仕映
时间:
2013-5-28 15:57
标题:
在网络编程中流对象的使用问题
本帖最后由 何仕映 于 2013-5-28 16:10 编辑
下面这个是我一个最简单的通过TCP传输的客户端和服务端的一个小程序。为了验证流对象在网络编程中的应用,所以在尽可能的使用了流对象。
在下面这个程序中,为什么在客户端用PrintStream将数据传送到客户端,客户端再存储起来,图片就打不开了呢?如果换成原来的OutputStream,在服务端获取的图片就能正常打开?
该代码已经在下面用红字标出。请各位帅哥美女指点一下。万分感谢。
import java.io.*;
import java.net.*;
class Client
{
public static void main(String[] args) throws Exception
{
//1、建立TCP服务的服务端Socket,绑定为本机的9090端口
Socket client = new Socket("127.0.0.1",9090);
//2、创建BufferedInputStream,读取要上传的文件。
BufferedInputStream clientin =
new BufferedInputStream(new FileInputStream(new File("F:\\合同.jpg")));
//3、获取服务端的输出流,用来上传数据
OutputStream clientout = client.getOutputStream();
<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="">
//4、读取文件并上传
for (int i=clientin.read();i!=-1 ;i=clientin.read() )
{
//<font color="#ff0000">clientout.write(i);</font><img src="http://cache.soso.com/img/img/e130.gif" smilieid="soso_e130" border="0" alt="">
p.print(i);
}
//5、关闭输出流
client.shutdownOutput();
//6、建立BufferedReader,用来接收服务器反馈的字符
BufferedReader clientr =
new BufferedReader(new InputStreamReader(client.getInputStream()));
//7、读取服务器反馈的字符信息,并打印
for (String string=clientr.readLine(); string!=null;string=clientr.readLine())
{
System.out.println(string);
}
//8、关闭资源
client.close();
clientin.close();
}
}
class Server
{
public static void main(String[] args)throws Exception
{
//1、建立服务端的ServerSocket对象,并让其监听9090端口
ServerSocket server = new ServerSocket(9090);
//2、获取连接该服务器的客户Socket
Socket clientw = server.accept();
//3、获取客户端的ip
String ip = clientw.getInetAddress().getHostAddress();
System.out.println(ip+"is connected");
//4、建立BufferedInputStream来读取客户端发过来的信息。
BufferedInputStream serverin = new BufferedInputStream(clientw.getInputStream());
//5、建立输入流将客户端上传的数据存贮
BufferedOutputStream serverp =
new BufferedOutputStream((new FileOutputStream(new File("F:\\背景音乐\\伤心男人\\合ddd同.jpg"))));
//建立PrintStream 使其能自动刷新
PrintStream ps = new PrintStream(serverp,true);
//7、读取客户端上传的东西并储存
for (int i=serverin.read(); i!=-1;i=serverin.read() )
{
ps.write(i);
}
//8、获取输出流对象,用来给客户端反馈信息
BufferedWriter serverb = new BufferedWriter(new OutputStreamWriter(clientw.getOutputStream()));
PrintWriter servers = new PrintWriter(serverb,true);
servers.println("上传成功");
//9、关闭该输出流,并关闭资源。
clientw.shutdownOutput();
serverp.close();
clientw.close();
}
}
复制代码
作者:
无妄无涯
时间:
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