黑马程序员技术交流社区
标题:
网络编程模拟客户端上传图片到服务器端出现了个问题找不着
[打印本页]
作者:
王士铭
时间:
2011-8-2 00:31
标题:
网络编程模拟客户端上传图片到服务器端出现了个问题找不着
网络编程模拟客户端上传图片到服务器端出现了个问题找不着,找了挺久都看不出什么错误,然后就重新写了一次成功了 可是这个类里面我到底是什么问题我一点都看不出来
UploadPic.java[code=java]import java.io.*;
import java.net.*;
class UploadPicClient
{
public static void main(String args[])throws Exception
{ if(args.length==0)
{
System.out.println("请选择一个文件");
return;
}
File file=new File(args[0]);
if(!(file.exists()&&file.isFile()&&file.getName().endsWith("jpg")))
{
System.out.println("请选择一个jpg的文件");
return ;
}
if(file.length()>4*1024*1204)
{
System.out.println("请选择一个小于4M的文件");
return ;
}
Socket s=new Socket("192.168.1.102",10001);
FileInputStream fis=new FileInputStream(file);
OutputStream outStream=s.getOutputStream();
int len=0;
byte buf[]=new byte[1024];
while((fis.read(buf))!=-1)
{
outStream.write(buf,0,len);
}
s.shutdownOutput();
InputStream inStream=s.getInputStream();
int num=0;
byte buffin[]=new byte[1024];
num=inStream.read(buffin);
String str=new String(buffin,0,num);
System.out.println(str);
fis.close();
s.close();
}
}
class UploadServiceThread implements Runnable
{ private Socket s;
public UploadServiceThread(Socket s)
{
this.s=s;
}
public void run()
{
try
{
String ip=s.getInetAddress().getHostAddress();
OutputStream outStream =s.getOutputStream();
InputStream inStream =s.getInputStream();
int count=1;
File file=new File(ip+"("+(count++) +")"+".jpg");
while(file.exists())
{
file=new File(ip+"("+(count++) +")"+".jpg");
}
FileOutputStream fos =new FileOutputStream(file);
int len =0;
byte buff[]=new byte[1024];
while((len=inStream.read(buff))!=-1)
{
fos.write(buff,0,len);
}
outStream.write("上传成功".getBytes());
fos.close();
s.close();
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}
class UploadPicService
{
public static void main(String args[])throws Exception
{
ServerSocket ss =new ServerSocket(10001);
while(true)
{
Socket s=ss.accept();
new Thread(new UploadServiceThread(s)).start();
}
}
}[/code]
作者:
詹季春
时间:
2011-8-2 00:44
标题:
回复 楼主 的帖子
上面代码第33行 因为read()方法返回的是读取的:
读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
我们看下write()方法的API文档:
--------------------------------------
public void write(String s,
int off,
int len)
throws IOException写入字符串的某一部分。
如果 len 参数的值为负数,则不写入任何字符。这与超类中此方法的规范正好相反,它要求抛出IndexOutOfBoundsException。
覆盖:
类 Writer 中的 write
参数:
s - 要写入的字符串
off - 开始读取字符处的偏移量
len - 要写入的字符数
-----------------------------------------------------------
因为你没有获取read()方法返回的值,那么你在使用write()方法的时候传入的len还是0,结果你懂得[code=java]int len=0;
byte buf[]=new byte[1024];
while((fis.read(buf))!=-1)
{
outStream.write(buf,0,len);
}[/code]这里是[code=java]while((len=fis.read(buf))!=-1)[/code]要不然后面的输出语句[code=java]outStream.write(buf,0,len);[/code]中的len还是0
[
本帖最后由 詹季春 于 2011-08-02 00:58 编辑
]
作者:
匿名
时间:
2011-8-2 11:06
标题:
回复 沙发 的帖子
:lol 感谢版主了,早上醒来想了一下,没法得到图片就想到应该是在输出流里面出来问题,没想到版主这么快就把问题解决了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2