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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© stamSuper 中级黑马   /  2014-5-8 09:49  /  1383 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

客户端的上传代码
  1. public static void copyFileClient(){
  2.                 BufferedInputStream bufin =  null;
  3.                 Socket socket = null;
  4.                 try {
  5.                         socket = new Socket("192.168.1.101",2006);
  6.                         String fileName = "aa.png";
  7.                         bufin = new BufferedInputStream(new FileInputStream("E:\\test\\"+fileName));
  8.                         BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
  9.                         //先把文件名称传到服务器  ,好确定上传后的文件名称
  10.                         out.write(fileName.getBytes());
  11.                         //out.write(System.getProperty("line.separator").getBytes());
  12.                         out.flush();
复制代码

我tcpServer端的代码  ,当然 我这都是在多线程中运行的,这个方法在线程的实现方法run方法中调用的
  1. public void copyFileServer(){
  2.                 BufferedOutputStream socOut = null;
  3.                 BufferedInputStream socIn = null;
  4.                
  5.                 BufferedOutputStream fileOut = null;
  6.                 try {
  7.                         String ip =socket.getInetAddress().getHostAddress();
  8.                        
  9.                         socIn =new BufferedInputStream(socket.getInputStream());
  10.                         socOut = new BufferedOutputStream(socket.getOutputStream());
  11.                        
  12.                         String path = "E:"+File.separator+"test"+File.separator+"temp"+File.separator;
  13.                         ///通过 流 和默认地址,得到要存放的文件
  14.                         File file = getSaveFile(socIn,path);
  15.                         System.out.println(ip+"-----------"+file);
  16.                         fileOut = new BufferedOutputStream(new FileOutputStream(file));
  17.                         byte [] buf  =new byte[1024];
  18.                         int len = -1;
  19.                         while(( len = socIn.read(buf))!=-1){
  20.                                 fileOut.write(buf,0,len);
  21.                                 fileOut.flush();
  22.                         }
  23.                         socket.shutdownInput();
  24.                         System.out.println("------------服务器端已经把数据全部写入到指定文件中"+file+"---------");
  25.                        
  26.                         socOut.write("已经上传完毕".getBytes());
  27.                         socOut.flush();
  28.                         fileOut.close();
  29.                         socket.close();
  30.                 } catch (IOException e) {
  31.                         e.printStackTrace();
  32.                 }
  33.         }
复制代码
  1. public static File getSaveFile(InputStream in,String path) throws IOException{
  2.                 int count =1;
复制代码



运行结果我也贴出来吧
如果我在客户端让线程停止一会儿的,服务器端打印的结果如下
  1. 192.168.1.101-----------E:\test\temp\aa(2).png
  2. ------------服务器端已经把数据全部写入到指定文件中E:\test\temp\aa(2).png---------
复制代码
如果我在客户端不让线程停止,服务器端打印的结果如下:
  1. 192.168.1.101-----------E:\test\temp\aa(1).png�PNG
  2. \032
  3. 。。。。后面是一些乱码数据,估计粘贴板不能复制这些数据,反正是粘贴不上来
复制代码




123.jpg (98.18 KB, 下载次数: 63)

TCPServer 上传报错

TCPServer 上传报错

评分

参与人数 1黑马币 +2 收起 理由
code2014 + 2 赞一个!

查看全部评分

3 个回复

倒序浏览
奇怪 ,上传的代码怎么只有  一部分了,
回复 使用道具 举报
我在贴一次代码tcpclient端代码
  1. public static void copyFileClient(){
  2. BufferedInputStream bufin =  null;
  3. Socket socket = null;
  4.                 try {
  5.                         socket = new Socket("192.168.1.101",2006);
  6.                         String fileName = "aa.png";
  7.                         bufin = new BufferedInputStream(new FileInputStream("E:\\test\\"+fileName));
  8.                         BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
  9.                         //先把文件名称传到服务器  ,好确定上传后的文件名称
  10.                         out.write(fileName.getBytes());
  11.                         //out.write(System.getProperty("line.separator").getBytes());
  12.                         out.flush();
  13.                         /*关键就这这一步,如果我不让当前线程停止一会儿, 后台获取 我这个文件名称的时候 ,会把文件中的数据也获取到 ,我贴的图片可以看到结果 */
  14.                         /*Thread.sleep(100);*/
  15.                         byte[] buf = new byte[1024];
  16.                         int len = -1;
  17.                         while((len = bufin.read(buf))!= -1){
  18.                                 out.write(buf,0,len);
  19.                                 out.flush();
  20.                         }
  21.                         System.out.println("---客户端已经把数据读取完毕--");
  22.                         socket.shutdownOutput();///  服务器端一直在等待  读取到客户端传输的结尾位置,而这个方法可以实现
  23.                         ///读取服务器反馈的 信息
  24.                         BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
  25.                         StringBuilder sb = new StringBuilder();
  26.                         int l = -1;
  27.                         System.out.println("*******客户端等待读取服务器端的数据*********");
  28.                         while((l = in.read(buf))!=-1){
  29.                                 sb.append(new String(buf,0,l));
  30.                         }
  31.                         System.out.println(sb.toString());
  32.                 } catch (Exception e) {
  33.                         e.printStackTrace();
  34.                 }finally{
  35.                         try {
  36.                                 if(bufin != null)
  37.                                         bufin.close();
  38.                                 if(socket !=null)
  39.                                         socket.close();
  40.                         } catch (IOException e) {
  41.                                 e.printStackTrace();
  42.                         }
  43.                 }
  44.         }
复制代码

tcpServer端代码

  1. public class DoServer  implements Runnable{
复制代码






回复 使用道具 举报
tcpServer端代码
  1. public class DoServer  implements Runnable{
  2.         private Socket socket ;
  3.         DoServer(Socket socket ){
  4.                 this.socket = socket;
  5.         }
  6.         @Override
  7.         public void run() {
  8.                 copyFileServer();
  9.         }
  10.         public void copyFileServer(){
  11.                 BufferedOutputStream socOut = null;
  12.                 BufferedInputStream socIn = null;
  13.                
  14.                 BufferedOutputStream fileOut = null;
  15.                 try {
  16.                         String ip =socket.getInetAddress().getHostAddress();
  17.                         socIn =new BufferedInputStream(socket.getInputStream());
  18.                         socOut = new BufferedOutputStream(socket.getOutputStream());
  19.                         String path = "E:"+File.separator+"test"+File.separator+"temp"+File.separator;
  20.                         ///通过 流 和默认地址,得到要存放的文件
  21.                         File file = getSaveFile(socIn,path);
  22.                         System.out.println(ip+"-----------"+file);
  23.                         fileOut = new BufferedOutputStream(new FileOutputStream(file));
  24.                         byte [] buf  =new byte[1024];
  25.                         int len = -1;
  26.                         while(( len = socIn.read(buf))!=-1){
  27.                                 fileOut.write(buf,0,len);
  28.                                 fileOut.flush();
  29.                         }
  30.                         socket.shutdownInput();
  31.                         System.out.println("------------服务器端已经把数据全部写入到指定文件中"+file+"---------");
  32.                         socOut.write("已经上传完毕".getBytes());
  33.                         socOut.flush();
  34.                         fileOut.close();
  35.                         socket.close();
  36.                 } catch (IOException e) {
  37.                         e.printStackTrace();
  38.                 }
  39.         }
  40.         /**
  41.          * 通过 socket获取流对象,然后根据流对象获取 客户端发送的要上传的文件名称
  42.          * @param in
  43.          * @param path
  44.          * @return
  45.          * @throws IOException
  46.          */
  47.         public static File getSaveFile(InputStream in,String path) throws IOException{
  48.                 int count =1;
  49.                 //这里不知道客户端上传的文件 名称是多少字符的,我就定义了 差不多 100个字符的长度
  50.                 byte []bufName = new byte[200];
  51.                 /*这里获取 客户端发送的文件名称,可能会把文件内容也获取到,这样的话就不是文件的名称了 ,所以服务器会报错  */
  52.                 int l =  in.read(bufName);
  53.                 String fileName = new String(bufName,0,l);
  54. //                String fileName ="test.png";
  55.                 String sufName = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length());
  56.                 String preName = fileName.substring(0, fileName.lastIndexOf("."));
  57.                 File file = new File(path+preName+"("+count+")"+"."+sufName);
  58.                 while(file.exists()){
  59.                         file = new File(path+preName+"("+count++ +")"+"."+sufName);
  60.                 }
  61.                 return file;
  62.         }
  63. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马