黑马程序员技术交流社区
标题:
关于网络编程2
[打印本页]
作者:
ぺsimon☆
时间:
2013-5-7 00:59
标题:
关于网络编程2
本帖最后由 ぺ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();
}
}
复制代码
作者:
孙金鑫
时间:
2013-5-7 01:21
while(file.exists())
{
file=new File(ip+"("+(count++)+")"+".jpg");
}
/*“2,然后线程3进来,发现ip+(1).jpg的文件已经存在了,也是创建ip+(2).jpg的文件,是这样吗?”
这里是一个while循环判断,知道判断到ip(*)不存在了,往下执行下去,如果你这里写的是if(file.exists()),那么你说的问题就会实现了;
再说了,new file(ip+"("+(count++)+")"+".jpg");,不会马上创建文件,只有执行到这一句 FileOutputStream fos = new FileOutputStream(file);才会创建文件。
1,你说的问题,的确有可能浪费资源。
*/
复制代码
作者:
黄玉昆
时间:
2013-5-8 21:11
如果问题未解决,请继续追问,如果问题解决了,请将分类改为“已解决”,谢谢
作者:
ぺsimon☆
时间:
2013-5-9 08:36
孙金鑫 发表于 2013-5-7 01:21
哦,知道了谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2