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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. 使用TCP协议写一个可以上传文件的服务器和客户端。
  2. * 思路:网络编程与IO流相拼命
  3. * 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream.
  4. *  还有通过socket的输入流读取服务器端的反馈信息。
  5. * 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息  
  6. * 资源关闭
  7. * */  
  8. import java.net.*;  
  9. import java.io.*;  
  10. public class FileLoader {  
  11.   
  12.     public static void main(String[] args) {  
  13.   
  14.     }  
  15.   
  16. }  
  17.   
  18. //客户端  
  19. class client {  
  20.     public static void main(String[] args) throws Exception {  
  21.         //建立Socket服务  
  22.         Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);  
  23.         //从客户端本地读取文件,并写入socket的输出流中  
  24.         OutputStream out = fileLoaderSocket.getOutputStream();  
  25.         InputStream fileRead = new FileInputStream("G:\\Demo.mp3");  
  26.          
  27.         byte[] buf = new byte[1024];  
  28.         int len = 0;  
  29.         while((len=fileRead.read(buf)) != -1) {  
  30.             out.write(buf, 0, len);  
  31.         }  
  32.         //告诉服务端,文件已传输完毕  
  33.         fileLoaderSocket.shutdownOutput();  
  34.          
  35.         //获取从服务端反馈的信息  
  36.         BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));  
  37.         String serverBack = in.readLine();  
  38.         System.out.println(serverBack);  
  39.          
  40.         //资源关闭  
  41.         fileLoaderSocket.close();  
  42.         fileRead.close();  
  43.     }  
  44. }  
  45.   
  46. //服务端  
  47. class Server {  
  48.     public static void main(String[] args) throws Exception {  
  49.         //建立服务端Socket  
  50.         ServerSocket ss = new ServerSocket(10005);  
  51.         //接收客户端Socket  
  52.         Socket fileLoaderSocket = ss.accept();  
  53.          
  54.         //打印连接信息  
  55.         String ip = fileLoaderSocket.getInetAddress().getHostAddress();  
  56.         System.out.println(ip + "...conncected");  
  57.          
  58.         //接收文件,并保存  
  59.         InputStream in = fileLoaderSocket.getInputStream();  
  60.         OutputStream fileSave = new FileOutputStream("E:\\server.mp3");  
  61.         byte[] buf = new byte[1024];  
  62.         int len = 0;  
  63.         while((len=in.read(buf)) != -1) {  
  64.             fileSave.write(buf, 0, len);  
  65.             fileSave.flush();  
  66.         }  
  67.         //返回文件复制情况信息  
  68.         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));  
  69.         out.write("文件上传成功");  
  70.         out.flush();  
  71.          
  72.         //资源关闭  
  73.         ss.close();  
  74.         fileLoaderSocket.close();  
  75.         fileSave.close();  
  76.     }  
  77. }  
复制代码

总感觉哪里错了,请高手指正。

1 个回复

倒序浏览
首先,你的
while((len=in.read(buf)) != -1) {  

64.            fileSave.write(buf, 0, len);  

65.            fileSave.flush();  

66.        }  
这里的fileSave.flush();没有用,这里并没有用到缓冲区
其次,
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));  

69.        out.write("文件上传成功");  

70.        out.flush();  
在69和70行之间,加一句out.newLine();因为你客户端是用readLine接受,他只有收到换行时才结束
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马