黑马程序员技术交流社区
标题:
在并发上传图片的程序中遇到的关于死循环的问题
[打印本页]
作者:
孙国军
时间:
2012-4-27 00:00
标题:
在并发上传图片的程序中遇到的关于死循环的问题
/*
需求:
通过TCP的Socket和ServerSocket,向服务端上传图片;
*/
import java.io.*;
import java.net.*;
class SocketClient
{
public static void main(String[] args)
{
File file=new File("yuanye.jpg");
if (!file.exists())
{
throw new RuntimeException("你所关联的图片不存在");
}
BufferedInputStream bufi=null;
try
{
bufi=new BufferedInputStream(new FileInputStream(file));
}
catch (FileNotFoundException fe)
{
throw new RuntimeException("您所关联的文件不存在");
}
Socket s=null;
try
{
s=new Socket("192.168.0.4",10000);
}
catch (UnknownHostException ue)
{
throw new RuntimeException("你说要连接的服务器地址有误");
}
catch (IOException ie)
{
throw new RuntimeException("套接字建立失败");
}
BufferedOutputStream bufo=null;
try
{
bufo=new BufferedOutputStream(s.getOutputStream());
byte[] buf=new byte[1024];
int len=0;
while ((len=bufi.read(buf))!=-1)
{
bufo.write(buf,0,len);
bufo.flush();
} //为什么这会变成死循环啊???
System.out.println("到这里..............");
s.shutdownOutput();
byte[] b=new byte[1024];
int num=s.getInputStream().read(b);
System.out.println(new String(b,0,num));
}
catch (IOException ie)
{
throw new RuntimeException("文件上传失败");
}
}
}
class ClientThread implements Runnable
{
private Socket s;
public ClientThread(Socket s)
{
this.s=s;
}
public void run()
{
File file=new File("yuanye复件.jpg");
InputStream is=null;
try
{
is=s.getInputStream();
}
catch (IOException ie)
{
throw new RuntimeException("获取用户端读取流失败");
}
BufferedOutputStream bufo=null;
try
{
bufo=new BufferedOutputStream(new FileOutputStream(file));
byte[] buf=new byte[1024];
int len=0;
while ((len=is.read(buf))!=-1)
{
bufo.write(buf,0,len);
bufo.flush();
}
OutputStream os=s.getOutputStream();
os.write("上传成功".getBytes());
}
catch (IOException ie)
{
throw new RuntimeException("文件上传失败");
}
finally
{
try
{
if (bufo!=null)
{
bufo.close();
}
}
catch (IOException i)
{
throw new RuntimeException("输出流关闭失败");
}
try
{
s.close();
}
catch (IOException i)
{
throw new RuntimeException("关闭客户端失败");
}
}
}
}
class SocketServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10000);
while (true)
{
Socket s=ss.accept();
new Thread(new ClientThread(s));
}
}
}
复制代码
问题在48行处,while(){}发生了死循环;
作者:
孙国军
时间:
2012-4-27 08:57
怎么一直没有人回答啊???
作者:
孙国军
时间:
2012-4-27 09:27
孙国军 发表于 2012-4-27 08:57
怎么一直没有人回答啊???
人 了 ,那些大师都跑哪去聊啊
作者:
丁佼
时间:
2012-4-27 10:01
new Thread(new ClientThread(s)).start(),现成是要运行才可以的。。。。
============================================================
运行你的代码,果然卡起,怀疑是客户端关闭网络输出流的时候出错了,更改代码:
System.out.println("到这里..............");
s.shutdownOutput();
System.out.println("到这里2..............");//更改1
发现可以输出 "到这里2.............." 可以得知是正确的输出文件了,打开文件夹发现服务端根本没有建立“yuanye复件.jpg”文件,怀疑服务端file流写错,查看一圈,没错。。。。
回到服务端主函数,想查看下是不是建立socket时错了,突然发现。。。你线程根本就没有start()啊。。
============================================================
这样竟然也可以编译通过。。java容忍度是在很高了。。。还是有什么专门的使用意义,求高手解释。
难道是
Thread t = new Thread(new ClientThread(s));
t.start();
...................2分钟后,求人不如求己,放到服务端代码里试一下,还真是正确运行了,java牛B了。。。。
以上,回答完毕。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2