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