黑马程序员技术交流社区

标题: 多线程TCP问题 [打印本页]

作者: chenyannna    时间: 2015-9-19 11:34
标题: 多线程TCP问题
问题:这个代码是服务端但是会出现问题。客户端上传图片时如果输入错,如“1...jpg”这样的,尽管会提示异常。但是在目的地
e盘也会建立文件。空的jpg文件。怎么修改会让客户端传的是错的时候就只提示信息。而不建立文件呢
  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;

  7. //Tcp上传图片多客户端上传
  8. //定义线程:明确每一个客户端要在服务端执行的代码,将其放到run方法中
  9. class PicThread implements Runnable {
  10.         private Socket s;// 获取哪个客户端还不知道就传进来

  11.         PicThread(Socket s) {
  12.                 this.s = s;
  13.         }

  14.         public void run() {
  15.                 int count = 1;// 为了防止上传覆盖做计数操作
  16.                 String ip = s.getInetAddress().getHostAddress();
  17.                 try { // 来一个客户端就在这里进行处理
  18.                         System.out.println(ip);
  19.                         InputStream in = s.getInputStream();
  20.                         File file = new File("e:\\" + ip + "(" + (count) + ")" + ".jpg");
  21.                         while (file.exists()) {
  22.                                 file = new File("e:\\" + ip + "(" + (count++) + ")" + ".jpg");
  23.                         }
  24.                         FileOutputStream fos = new FileOutputStream(file);
  25.                         byte[] buf = new byte[1024];
  26.                         int len = 0;
  27.                         while ((len = in.read(buf)) != -1) {
  28.                                 fos.write(buf, 0, len);
  29.                         }
  30.                         OutputStream out = s.getOutputStream();
  31.                         out.write("上传成功".getBytes());
  32.                         fos.close();
  33.                         s.close();
  34.                 } catch (Exception e) {
  35.                         throw new RuntimeException(ip + ":上传失败");
  36.                 }
  37.         }
  38. }

  39. public class TcpServer5 {
  40.         public static void main(String[] args) throws Exception {
  41.                 ServerSocket ss = new ServerSocket(20000);
  42.                 while (true) {
  43.                         Socket s = ss.accept();// 阻塞式方法
  44.                         // 循环建立线程。有一个客户端就建立一个
  45.                         new Thread(new PicThread(s)).start();
  46.                 }
  47.         }
  48. }
复制代码

作者: lion_good    时间: 2015-9-19 16:20
在catch里删除该文件
作者: 清心玉质    时间: 2015-9-20 15:38
对客户端的限制在客户端代码里写判断代码,如果格式错误根本不会传到服务端。
在客户端代码,文件路径通过主函数参数传进来,进行一系列判断
String s = args[0];
                File f = new File(s);
                if(!(f.getName().endsWith(".jpg"))){
                        System.out.println("传输文件格式错误");
                        return;
作者: chenyannna    时间: 2015-9-21 15:36
清心玉质 发表于 2015-9-20 15:38
对客户端的限制在客户端代码里写判断代码,如果格式错误根本不会传到服务端。
在客户端代码,文件路径通过 ...

好的 谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2