关于Java开发 Socket传输文件后继续通信的实现

 

**********************************找了好多资料,都不能实现只关流不关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,自己可以补上,代码运行没有问题*************

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值