您的位置:程序门 -> java -> j2se / 扩展类



java socket一次可以传输多个文件


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


java socket一次可以传输多个文件
发表于:2008-01-20 18:11:54 楼主
谁能帮我看看这个代码,我开始是向客户端发送file的大小,然后发送file流,在客户端先根据file的大小来接收固定的file流啊,可是第一文件可以接收到,但是第二个,第三个....都为0字节哦,请教哪位高手能帮帮小弟哦!!
代码如下:
服务器:
package   com.sunyard.hefei;

import   java.io.bufferedinputstream;
import   java.io.bufferedoutputstream;
import   java.io.datainputstream;
import   java.io.dataoutputstream;
import   java.io.file;
import   java.io.fileinputstream;
import   java.io.ioexception;
import   java.io.inputstream;
import   java.io.objectoutputstream;
import   java.io.outputstream;
import   java.net.serversocket;
import   java.net.socket;
import   java.util.list;

class   javaserver   extends   thread   {
serversocket   server;

public   javaserver()   {
try   {
server   =   new   serversocket(6000);
}   catch   (ioexception   e)   {
system.out.println("cannot       create       server");
system.exit(0);
}
system.out.println("now       socket       server       will       start");
this.start();
}

public   void   run()   {
try   {
while   (true)   {
socket   client   =   server.accept();
//   system.out.println("ip:   "+client.getinetaddress());//get
//   client's   ip   address;
service   ss   =   new   service(client);
}
}   catch   (ioexception   e)   {
system.out.println("cannot       provide       service       !");
system.exit(1);
}
}

public   static   void   main(string   args[])   {
new   javaserver();
/*
  *   keyinput   =   new   datainputstream(system.in);   try   {   data   =
  *   keyinput.readline();   }   catch   (ioexception   e)   {   return;   }   if
  *   (data.equals("quit"))   system.exit(1);
  */
}
}

class   service   extends   thread   {

datainputstream   inputs;

addimages   addimag   ;

datainputstream   dis   =   null;

dataoutputstream   dos   =   null;
dataoutputstream   outputs;

socket   client;

public   service(socket   clientsocket)   {
client   =   clientsocket;
try   {
inputs   =   new   datainputstream(client.getinputstream());
}   catch   (ioexception   e)   {
system.out.println("cannot       connect       with       client       !");
return;
}
this.start();
}

public   void   run()   {
try   {
objectoutputstream   out   =   new   objectoutputstream(client
.getoutputstream());
outputstream   ops   =   client.getoutputstream();
list   images   =   message.getimagefiles();
if   (!images.isempty())   {
out.writeobject(images);
out.flush();
file   image   =   null;
for   (int   j   =   0;   j   <   images.size();   j++)   {
image   =   (file)images.get(j);   //   文件已经根据路径new   file了
bufferedinputstream   imgstream   =   new   bufferedinputstream(
new   fileinputstream(image));
dis   =   new   datainputstream(
new   bufferedinputstream(
new   fileinputstream(image)));
dos   =   new   dataoutputstream(
new   bufferedoutputstream(ops));
int   imglength   =   integer.parseint(string
.valueof(image.length()));
byte[]   buf   =   new   byte[imglength];
while   ((dis.read(buf))   !=   -1)   {
dos.write(buf,   0,   buf.length);
}
}
dos.close();
dos.flush();

}
}   catch   (exception   e)   {
system.out.println("read       data       error");
e.printstacktrace();
}
    try   {
    client.close();  
    }   catch   (ioexception   e)   {
    system.out.println("cannot   close   socket");
    }
}
}
客户端:
package   com.sunyard.hefei;

import   java.io.*;
import   java.net.*;
import   java.util.collection;
import   java.util.list;

class   javaclient   {

private   static   socket   client;

public   static   void   main(string   args[])   {
try   {
inetaddress   in   =   inetaddress.getlocalhost();
system.out.println(in.gethostaddress());//   get   host   ip   address;
client   =   new   socket(in.gethostaddress(),   6000);
}   catch   (ioexception   e)   {
system.out.println("cannot       connect   with       server");
e.printstacktrace();
}
try   {

objectinputstream   in   =   null;
if   (client.getinputstream()   !=   null)   {
in   =   new   objectinputstream(client.getinputstream());
}   else   {
return;
}
dataoutputstream   dos   =   null;
datainputstream   dis   =   null;
collection   messages   =   (collection)   in.readobject();   //   接收到的文字信息集合
list   info   =   (list)   messages;
system.out.println("size:   "   +   info.size());
if   (!messages.isempty())   {
for   (int   i   =   0;   i   <   info.size();   i++)   {
file   imagefile   =   (file)   info.get(i);
string   imagename   =   imagefile.getname();   //   图片名字
system.out.println("length:   "   +   imagefile.length());
int   imglength   =   integer.parseint(string.   //   图片长度
valueof(imagefile.length()));
inputstream   ips   =client.getinputstream();
system.out.println("available:   "+ips.available());
file   image   =   new   file("e:\\"   +   imagename);
file   renameimg   =   new   file("e:\\"   +   i   +   imagename);
bufferedinputstream   br   =   new   bufferedinputstream(
ips);
dis   =   new   datainputstream(br);
//   以datainputstream来包装字节缓冲输入流
if   (!image.exists())   {
//   以dataoutputstream来包装字节缓冲输出流
dos   =   new   dataoutputstream(new   bufferedoutputstream(
new   fileoutputstream(image)));   //   将图片保存到文件夹
}   else   {
dos   =   new   dataoutputstream(new   bufferedoutputstream(
new   fileoutputstream(renameimg)));
}
byte[]   bufr   =   new   byte[imglength];
//   网络传输都是以字节的方式传递的
while   ((dis.read(bufr))   !=   -1)   {
//   一边读,一边写
dos.write(bufr,   0,   bufr.length);
}
system.out.println("客户端端接收完毕");
}
}   else   {
}
}   catch   (exception   e)   {
system.out.println("ioexception   happened");
e.printstacktrace();
}
try   {
system.out.println("now       will     end     this       program");
client.close();
}   catch   (ioexception   e)   {
system.out.println("system       cannot     close       socket");
e.printstacktrace();
}
}
}

发表于:2008-01-20 21:21:251楼 得分:0
??
这个要看你的协议啊。
发表于:2008-01-22 11:29:572楼 得分:0
请问你给我一个小demo吗?我好好研究一下啊!!一点点代码也行啊!!在此谢了!
发表于:2008-01-22 11:33:533楼 得分:0
很急哦,求你帮帮忙拉?
发表于:2008-01-22 11:54:534楼 得分:0
复杂问题简单化,关闭socket,重新建立,发送第二个!
keep-alive的方式比较难调试!
发表于:2008-01-22 15:05:295楼 得分:0
很感谢你的回答,但要是我要传输的文件很多的时候,每次都要建立连接,再如果很多客户端请求服务器建立连接,那不是很糟糕吗???
发表于:2008-01-22 15:13:136楼 得分:0
你服务器端做   线程   连接池,速度很快的,就像   http   协议那样。
发表于:2008-01-22 15:17:047楼 得分:0
高手!!看来你是做过了吧,小弟我不太懂哦,能借点代码看看否??谢谢哦
发表于:2008-01-22 17:41:528楼 得分:0
1   把线程放到vector   线程池里面
2   每次从vector里面拿到第一个空闲的,如果没有,就新建一个线程,并保存到线程池。   线程状态为使用中
3   线程完毕后,通知管理类,管理类把线程标识为空闲

就这么简单

可以封装为简单的方法
java code
public mythread getfreethread(){ .. // 从池里面获取一个空闲线程 } public void finished(mythread o){ // 线程通知管理类,我已经完成了 }
发表于:2008-01-23 09:42:109楼 得分:0
楼主可以更简单点就是,把你要传送的内容封装在一个class,   这个class继承serializable,然后进行发送,到客户端再次接收,然后把内容读出来就行

 
发表于:2008-01-23 13:33:1910楼 得分:0
请问在客服端是采用这种方式接受对象吗?谢了。
in   =   new   objectinputstream(socket.getinputstream());
collection   messages   =   (collection)   in.readobject();
发表于:2008-01-23 14:17:3411楼 得分:0
客户端报的异常:
java.io.writeabortedexception:   writing   aborted;   java.io.notserializableexception:   java.io.datainputstream
at   java.io.objectinputstream.readobject0(unknown   source)
at   java.io.objectinputstream.defaultreadfields(unknown   source)
at   java.io.objectinputstream.readserialdata(unknown   source)
at   java.io.objectinputstream.readordinaryobject(unknown   source)
at   java.io.objectinputstream.readobject0(unknown   source)
at   java.io.objectinputstream.readobject(unknown   source)
at   java.util.arraylist.readobject(unknown   source)
at   sun.reflect.nativemethodaccessorimpl.invoke0(native   method)
at   sun.reflect.nativemethodaccessorimpl.invoke(unknown   source)
at   sun.reflect.delegatingmethodaccessorimpl.invoke(unknown   source)
at   java.lang.reflect.method.invoke(unknown   source)
at   java.io.objectstreamclass.invokereadobject(unknown   source)
at   java.io.objectinputstream.readserialdata(unknown   source)
at   java.io.objectinputstream.readordinaryobject(unknown   source)
at   java.io.objectinputstream.readobject0(unknown   source)
at   java.io.objectinputstream.readobject(unknown   source)
at   com.sunyard.hefei.javaclient.main(javaclient.java:33)
caused   by:   java.io.notserializableexception:   java.io.datainputstream
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.defaultwritefields(unknown   source)
at   java.io.objectoutputstream.writeserialdata(unknown   source)
at   java.io.objectoutputstream.writeordinaryobject(unknown   source)
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.writeobject(unknown   source)
at   java.util.arraylist.writeobject(unknown   source)
at   sun.reflect.nativemethodaccessorimpl.invoke0(native   method)
at   sun.reflect.nativemethodaccessorimpl.invoke(unknown   source)
at   sun.reflect.delegatingmethodaccessorimpl.invoke(unknown   source)
at   java.lang.reflect.method.invoke(unknown   source)
at   java.io.objectstreamclass.invokewriteobject(unknown   source)
at   java.io.objectoutputstream.writeserialdata(unknown   source)
at   java.io.objectoutputstream.writeordinaryobject(unknown   source)
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.writeobject(unknown   source)
at   com.sunyard.hefei.service.run(javaserver.java:106)
192.168.0.28
ioexception   happened
now       will     end     this       program

服务器端报的异常:
now       socket       server       will       start
read       data       error
java.io.notserializableexception:   java.io.datainputstream
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.defaultwritefields(unknown   source)
at   java.io.objectoutputstream.writeserialdata(unknown   source)
at   java.io.objectoutputstream.writeordinaryobject(unknown   source)
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.writeobject(unknown   source)
at   java.util.arraylist.writeobject(unknown   source)
at   sun.reflect.nativemethodaccessorimpl.invoke0(native   method)
at   sun.reflect.nativemethodaccessorimpl.invoke(unknown   source)
at   sun.reflect.delegatingmethodaccessorimpl.invoke(unknown   source)
at   java.lang.reflect.method.invoke(unknown   source)
at   java.io.objectstreamclass.invokewriteobject(unknown   source)
at   java.io.objectoutputstream.writeserialdata(unknown   source)
at   java.io.objectoutputstream.writeordinaryobject(unknown   source)
at   java.io.objectoutputstream.writeobject0(unknown   source)
at   java.io.objectoutputstream.writeobject(unknown   source)
at   com.sunyard.hefei.service.run(javaserver.java:106)
exception   in   thread   "thread-1"   java.lang.nullpointerexception
at   com.sunyard.hefei.service.run(javaserver.java:114)

发表于:2008-01-23 14:20:3712楼 得分:0
请教,我的类实现了java.io.serializable,可不知道就不行呢??


快速检索

最新资讯
热门点击