Java Socket一次可以传输多个文件

elvis456 2008-01-20 06: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();
}
}
}

...全文
1028 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
leaderbird 2011-02-09
  • 打赏
  • 举报
回复
另外。我这边试了一下你这代码。是所有文件都没得到内容(都是0kb)、文件名是全部通过
out.writeObject(images);和
Collection messages = (Collection) in.readObject();
可以得到文件列表
leaderbird 2011-02-09
  • 打赏
  • 举报
回复
AddImages?这个是你自己定义的还是……?嗯,一个普通的List<File>对象可以不?
whoamihb 2008-01-23
  • 打赏
  • 举报
回复
楼主可以更简单点就是,把你要传送的内容封装在一个class, 这个class继承Serializable,然后进行发送,到客户端再次接收,然后把内容读出来就行

elvis456 2008-01-23
  • 打赏
  • 举报
回复
请教,我的类实现了java.io.Serializable,可不知道就不行呢??
elvis456 2008-01-23
  • 打赏
  • 举报
回复
客户端报的异常:
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)

elvis456 2008-01-23
  • 打赏
  • 举报
回复
请问在客服端是采用这种方式接受对象吗?谢了。
in = new ObjectInputStream(socket.getInputStream());
Collection messages = (Collection) in.readObject();
老紫竹 2008-01-22
  • 打赏
  • 举报
回复
复杂问题简单化,关闭socket,重新建立,发送第二个!
keep-alive的方式比较难调试!
elvis456 2008-01-22
  • 打赏
  • 举报
回复
很急哦,求你帮帮忙拉?
elvis456 2008-01-22
  • 打赏
  • 举报
回复
请问你给我一个小demo吗?我好好研究一下啊!!一点点代码也行啊!!在此谢了!
老紫竹 2008-01-22
  • 打赏
  • 举报
回复
1 把线程放到Vector 线程池里面
2 每次从Vector里面拿到第一个空闲的,如果没有,就新建一个线程,并保存到线程池。 线程状态为使用中
3 线程完毕后,通知管理类,管理类把线程标识为空闲

就这么简单

可以封装为简单的方法
public MyThread getFreeThread(){
.. // 从池里面获取一个空闲线程
}

public void finished(MyThread o){
// 线程通知管理类,我已经完成了
}
elvis456 2008-01-22
  • 打赏
  • 举报
回复
高手!!看来你是做过了吧,小弟我不太懂哦,能借点代码看看否??谢谢哦
老紫竹 2008-01-22
  • 打赏
  • 举报
回复
你服务器端做 线程 连接池,速度很快的,就像 http 协议那样。
elvis456 2008-01-22
  • 打赏
  • 举报
回复
很感谢你的回答,但要是我要传输的文件很多的时候,每次都要建立连接,再如果很多客户端请求服务器建立连接,那不是很糟糕吗???
Slugfest 2008-01-20
  • 打赏
  • 举报
回复
??
这个要看你的协议啊。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧