谁能帮我看看这个代码,我开始是向客户端发送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();
}
}
}

解决方案 »

  1.   

    请问你给我一个小demo吗?我好好研究一下啊!!一点点代码也行啊!!在此谢了!
      

  2.   

    复杂问题简单化,关闭socket,重新建立,发送第二个!
    keep-alive的方式比较难调试!
      

  3.   

    你服务器端做 线程 连接池,速度很快的,就像 http 协议那样。
      

  4.   

    1 把线程放到Vector 线程池里面
    2 每次从Vector里面拿到第一个空闲的,如果没有,就新建一个线程,并保存到线程池。 线程状态为使用中
    3 线程完毕后,通知管理类,管理类把线程标识为空闲就这么简单可以封装为简单的方法
    public MyThread getFreeThread(){
      .. // 从池里面获取一个空闲线程
    }public void finished(MyThread o){
      // 线程通知管理类,我已经完成了
    }
      

  5.   

    楼主可以更简单点就是,把你要传送的内容封装在一个class, 这个class继承Serializable,然后进行发送,到客户端再次接收,然后把内容读出来就行 
      

  6.   

    请问在客服端是采用这种方式接受对象吗?谢了。
    in = new ObjectInputStream(socket.getInputStream());
    Collection messages = (Collection) in.readObject();
      

  7.   

    客户端报的异常:
    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)
      

  8.   

    请教,我的类实现了java.io.Serializable,可不知道就不行呢??
      

  9.   

    AddImages?这个是你自己定义的还是……?嗯,一个普通的List<File>对象可以不?
      

  10.   

    另外。我这边试了一下你这代码。是所有文件都没得到内容(都是0kb)、文件名是全部通过
    out.writeObject(images);和
    Collection messages = (Collection) in.readObject(); 
    可以得到文件列表