**********************************找了好多资料,都不能实现只关流不关socket,半开关socket也不能满足我的需求,最后灵光一闪,能不能把文件字节存在集合中,通过对象流发送,那么这样客户端和服务器只认为是一次正常通信,而不是有字节数据的循环通信,这样就可以达到想要的效果.结果是可以的,以下就是正确的可以无限交互的服务器和客户端.************************************************
客户端:
package com.cn.test.copy;
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.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @author 高鑫大帅哥
*客户端
*/
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8000);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
ObjectInputStream ois = new ObjectInputStream(is);
oos.writeObject("upload");
String str = (String) ois.readObject();
if (str.equals("yes")) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入上传的文件路径");
String next = sc.next();
File file = new File(next);
oos.writeObject(file.getName());
DataInputStream dis = new DataInputStream(new FileInputStream(file));
DataOutputStream dos = new DataOutputStream(os);
List<Integer> list = new ArrayList<Integer>();
int read = -1;
while (true) {
read = dis.read();
if (read == -1) {
break;
}
list.add(read);
}
oos.writeObject(list);
Object o = ois.readObject();
System.out.println(o);
oos.writeObject("ok");
dos.close();
dis.close();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务器端
package com.cn.test.copy;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
/**
* @author 高鑫大帅哥
* 服务器端 多线程的
*/
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket s = new ServerSocket(8000);
while (true) {
Socket socket = s.accept();
new Thread() {
public void run() {
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
ObjectInputStream ois = new ObjectInputStream(is);
ObjectOutputStream oos = new ObjectOutputStream(os);
DataInputStream dis = new DataInputStream(is);
String str = (String) ois.readObject();
// System.out.println("服务器:"+str);
if (str.equals("upload")) {
oos.writeObject("yes");
String filename = (String) ois.readObject();
File file = new File("D:" + File.separator + "upload" + File.separator + filename);
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
List<Integer> list = (List<Integer>) ois.readObject();
for (int i : list) {
dos.write(i);
dos.flush();
}
oos.writeObject("上传成功");
System.out.println(ois.readObject());
// System.out.println(socket.getInetAddress().getHostName()+"上传完成");
dos.close();
dis.close();
oos.close();
os.close();
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
};
}.start();
}
}
}
***********修改后的代码在最后没有关流和socket,自己可以补上,代码运行没有问题*************