本帖最后由 ぺsimon☆ 于 2013-5-9 08:37 编辑
- /*
- 上传图片到服务器
- */
- import java.io.*;
- import java.net.*;
- class PicClient
- {
- public static void main(String[] args)throws Exception
- {
- if(args.length!=1)//判断字符串数组长度是否为1
- {
- System.out.println("请选择一个jpg格式的图片");
- return;
- }
- //把输入的路径封装成文件对象
- File file=new File(args[0]);
- //判断输入的路径是否存在和路径是否是文件
- if(!(file.exists()&&file.isFile()))
- {
- System.out.println("该文件有问题,要么不存在,要么不是文件");
- }
- //判断文件格式为jpg
- if(!file.getName().endsWith(".jpg"))
- {
- System.out.println("图片格式错误,请重新选择");
- }
- //判断文件大小
- if(file.length()>1024*1024*5)
- {
- System.out.println("图片过大,没安好心");
- }
- //创建一个客户端的Socket
- Socket s=new Socket("169.254.0.84",1006);
-
- //建立一个文件读取流,和文件对象相关联
- FileInputStream fis=new FileInputStream(file);
- //获取客户端Socket的网络字节输入流对象
- InputStream fisin=s.getInputStream();
- //获取客户端Socket的网络字节输出流对象
- OutputStream fosout=s.getOutputStream();
- byte[] buf=new byte[1024];//定义字节数组
- int len=0;
- //读取文件数据,并把数据写入Socket的网络输出流对象中
- while((len=fis.read(buf))!=-1)
- {
- fosout.write(buf,0,len);
- }
- s.shutdownOutput();//写入结束标记
- byte[] buf2=new byte[1024];
- int len2=0;
- //读取服务端反馈回来的信息
- len2=fisin.read(buf2);
- //把服务端反馈回来的信息打印在控制台
- System.out.println(new String(buf2,0,len2));
- fis.close();
- s.close();
- }
- }
- class PicThread implements Runnable //实现Runnable,定义多线程代码
- {
- private Socket s;
- PicThread(Socket s)
- {
- this.s=s;
- }
- public void run()
- {
- int count=1;
- //获取客户端的ip地址
- String ip=s.getInetAddress().getHostAddress();
- try
- {
- //打印客户端的ip地址
- System.out.println("connect..."+ip);
-
- //创建一个文件对象
- File file=new File(ip+"("+(count)+")"+".jpg");
- /*
- 注意:问题在这里!!!代码的本意是如果是同一个ip重复上传图片,文件名按照ip+"("+(count++)+")"+".jpg"来进行标记
- 问题1:
- 线程1作为第一个进来,读到count=1,创建了ip+(1).jpg的文件,然后线程2第二个进来,也读到count=1,也创建了ip+(1).jpg的文件,线程3进来,也是创建ip+(1).jpg的文件,这样的话每个线程进来都会创建这样的对象,这不是浪费资源吗,是这样吗?
- 问题2:
- 线程1作为第一个进来,读到count=1,创建了ip+(1).jpg的文件,然后线程2第二个进来,读到下面的判断语句,发现ip+(1).jpg的文件已经存在了,就创建ip+(2).jpg的文件,然后线程3进来,发现ip+(1).jpg的文件已经存在了,也是创建ip+(2).jpg的文件,是这样吗?如果是这样的话,count岂不是不超过2?真是不太明白...
- */
- while(file.exists())
- {
- file=new File(ip+"("+(count++)+")"+".jpg");
- }
- FileOutputStream fos=new FileOutputStream(file);
- InputStream fisin=s.getInputStream();
- byte[] buf=new byte[1024];
- int len=0;
- while((len=fisin.read(buf))!=-1)
- {
- fos.write(buf,0,len);
- }
- OutputStream fosout=s.getOutputStream();
- fosout.write("上传图片成功".getBytes());
- fos.close();
- s.close();
- }
- catch(Exception e)
- {
- throw new RuntimeException("文件上传失败");
- }
- }
- }
- class PicServer
- {
- public static void main(String[] args)throws Exception
- {
- ServerSocket ss=new ServerSocket(1006);
- while(true)
- {
- Socket s=ss.accept();
- new Thread(new PicThread(s)).start();
- }
-
-
-
- //ss.close();
- }
- }
复制代码 |