`
yanguz123
  • 浏览: 568645 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ Java 使用Socket多线程传输整个文件夹

    博客分类:
  • Code
 
阅读更多

一.列出莫文件夹中所有的文件和文件夹的工具类,磁盘列表类

 

package upload;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ListFiles {
	private List<File> fileList = new ArrayList<File>();

	public void listAllFiles(File file) {
		File[] files = file.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				if (files[i].listFiles() != null && files[i].listFiles().length > 0) {
					listAllFiles(files[i]);
				} else {
					fileList.add(files[i]);
				}
			} else {
				fileList.add(files[i]);
			}
		}
	}

	public List<File> getAllFiles(File file) {
		this.listAllFiles(file);
		return fileList;
	}

	public static void main(String[] args) {
		System.out.println(new ListFiles().getAllFiles(new File("E:\\temp\\")));
	}
}

 

package upload;

public enum DiskName {
	C, D, E, F, G, H, I, J, K
}

 

 

 

 

 

二.服务器端程序

1.文件处理

package upload;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

public class UploadFileServer implements Runnable {

	private Socket socket;
	private DiskName diskName;

	public UploadFileServer(Socket socket, DiskName diskName) {
		this.socket = socket;
		this.diskName = diskName;
	}

	@Override
	public void run() {
		DataInputStream dis = null;
		FileOutputStream fos = null;

		try {
			long start = System.currentTimeMillis();
			dis = new DataInputStream(socket.getInputStream());
			String filePath = dis.readUTF();
			String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
			String strDir = diskName.name()
					+ filePath.substring(filePath.indexOf(":"), filePath.lastIndexOf("\\"))
					+ File.separator;

			File d = new File(strDir);
			d.mkdirs();

			File file = new File(strDir + fileName);
			file.createNewFile();

			if (file.isFile()) {
				fos = new FileOutputStream(file);
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = dis.read(buffer, 0, buffer.length)) > 0) {
					fos.write(buffer, 0, len);
					fos.flush();
				}
			}

			long end = System.currentTimeMillis();
			System.out.println("cost: " + ((end - start) / 1000) + " s, size: "
					+ (file.length() / 1024.0) + " KB , file: " + file.getAbsolutePath());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (dis != null) {
				try {
					dis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

 

2.启动类

package upload;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(9999);
		while (true) {
			Socket socket = server.accept();
			new Thread(new UploadFileServer(socket, DiskName.D)).start();
		}
	}
}

 

 

 

 

 

 

三.客户端程序

1.文件处理

package upload;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class UploadFileClient implements Runnable {
	private Socket socket;
	private File file;

	public UploadFileClient(Socket socket, File file) {
		this.socket = socket;
		this.file = file;
	}

	@Override
	public void run() {
		DataOutputStream dos = null;
		FileInputStream fis = null;
		try {
			long start = System.currentTimeMillis();
			dos = new DataOutputStream(socket.getOutputStream());
			if (file.isFile()) {
				fis = new FileInputStream(file);

				dos.writeUTF(file.getAbsolutePath());
				byte[] sendBuffer = new byte[1024];
				int len = 0;
				while ((len = fis.read(sendBuffer, 0, sendBuffer.length)) > 0) {
					dos.write(sendBuffer, 0, len);
					dos.flush();
				}
			} else {
				dos.writeUTF(file.getAbsolutePath() + File.separator);
			}
			long end = System.currentTimeMillis();
			System.out.println("cost: " + ((end - start) / 1000) + " s, size: "
					+ (file.length() / 1024.0) + " KB , file: " + file.getAbsolutePath());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (dos != null) {
				try {
					dos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

 

 

2.启动类

package upload;

import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.List;

public class SocketClient {
	public static void main(String[] args) throws IOException {
		List<File> fileList = new ListFiles().getAllFiles(new File("E:\\java standard\\"));
		for (int i = 0; i < fileList.size(); i++) {
			Socket socket = new Socket();
			socket.connect(new InetSocketAddress("127.0.0.1", 9999));
			new Thread(new UploadFileClient(socket, fileList.get(i))).start();
		}
	}
}

 

分享到:
评论

相关推荐

    \\(^_^)/ Java 使用Socket多线程传输整个文件夹

    本篇文章将详细讲解如何利用Java的Socket和多线程技术来实现整个文件夹的传输。 首先,理解Socket通信的基本原理。Socket是网络通信中的端点,它允许两个程序通过网络连接进行数据交换。在Java中,`java.net.Socket...

    java socket文件夹传输

    - **多线程**:如果文件夹中包含大量文件,可以考虑使用多线程并发传输,以提高整体速度。 - **断点续传**:为防止传输中断,可以实现断点续传功能,记录已传输的部分,下次可以从上次断点处继续。 7. **安全性**...

    java_sx.rar_java socket _java 通讯_socket

    Java Socket是Java编程语言中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了可靠的双向、连接导向的数据传输服务。在Java中,Socket和ServerSocket类是进行网络通信的基础,它们分别代表客户端和服务器端的...

    JAVA Socket编程实现文件上传

    以上就是使用Java Socket编程实现文件上传涉及到的主要知识点,包括Socket通信机制、文件I/O、数据库操作、异常处理、多线程、安全性和性能优化等方面。理解并掌握这些内容,对于开发高效、可靠的文件上传系统至关...

    java_tx.rar_java c/s

    - **多线程**:在网络通信中,为了处理并发请求,通常需要使用多线程技术。Java的Thread类和Runnable接口使得多线程编程变得简单。 - **IO流**:Java的InputStream和OutputStream类族用于读写网络数据,...

    tcp_test.rar_java tcp 多线程_java tcp 线程_tcp 多线程_tcp线程_多线程 TCP

    本项目"tcp_test.rar"似乎是一个关于Java实现TCP多线程传输的实例,它涵盖了发送方和接收方的并发处理。 首先,让我们了解TCP多线程的概念。在单线程TCP服务器中,服务器接收到一个客户端连接后,会阻塞等待该连接...

    JAVA写的多线程socket通信程序源码

    在Java编程领域,多线程Socket通信是一种常见且重要的网络编程技术。Socket是TCP/IP协议栈中的一个关键组件,用于在网络中实现进程间的通信。在这个名为"JAVA写的多线程socket通信程序源码"的项目中,我们可以看到...

    Java基于Socket实现文件传输示例

    这个简单的示例演示了如何通过Java Socket进行文件传输的基本步骤,但实际应用中可能需要考虑更多细节,如错误处理、断线重连、多线程支持、文件分块传输等。对于跨平台的问题,Java本身是跨平台的,但是文件路径、...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    在NIO服务端编程中,通常会使用`Selector`来监听多个通道的事件,当有新的连接、数据可读或写操作完成时,`Selector`会通知程序,从而避免了传统IO模型中必须为每个连接创建一个线程的开销。 标签“nio nio-socket ...

    java多线程网络传输文件(非同步)

    本文将详细介绍如何使用Java实现基于Socket的多线程非同步网络文件传输。 #### 关键技术点 1. **Socket通信**:Socket是实现网络通信的基础组件,它提供了一种在网络间进行双向数据传输的方式。在Java中,可以使用...

    Java网络编程多线程断点下载带界面选择文件夹进度条

    Java网络编程多线程断点下载带界面选择文件夹进度条是一个高级的编程主题,它涉及到网络通信、多线程处理、文件I/O操作以及图形用户界面的设计。在这个项目中,我们将探讨以下几个关键知识点: 1. **网络编程基础**...

    java多线程聊天室

    Java多线程聊天室是一个基于Java编程语言实现的实时通讯应用,它利用多线程技术来处理并发用户连接和通信。在这个项目中,有至少两个关键的类:Server和Control,它们分别扮演着服务器端和客户端控制台的角色。在...

    JavaSocket传输文件夹.rar

    本示例中,"JavaSocket传输文件夹.rar"包含的服务端(MyServer.java)和客户端(MyClient.java)代码,展示了如何利用Java Socket API来传输整个文件夹的内容。以下是对这个主题的详细讲解: 1. **Java Socket API*...

    Java 聊天室 Java 课程设计 Java毕业设计 多线程 sokect C/S模式

    Java聊天室是一个典型的Java应用程序,它展示了如何利用多线程、Socket编程以及客户端/服务器(C/S)架构来实现一个实时通信系统。在这个项目中,我们不仅能够学习到基础的Java编程技巧,还能深入理解网络通信的核心...

    java基于socket聊天室实现

    在实际开发中,Java聊天室可能还会涉及多线程同步、线程池优化、心跳机制、断线重连策略、加密传输等高级话题。为了提高用户体验,还可以考虑添加用户名注册、好友系统、群组聊天等功能,使得聊天室更接近实际的应用...

    Java网络编程多线程断点下载带界面选择文件夹进度条.zip

    在这个特定的项目中,我们关注的是一个实现多线程断点续传功能的Java应用程序,它还具有用户界面来选择保存文件的目录,并显示下载进度条。这个程序的实现涉及到以下几个关键知识点: 1. **Socket编程**:Java中的...

    ipm.rar_java 文件传输_文件传输_飞鸽

    3. **多线程**:在服务器端,可能需要为每个连接创建一个新的线程来处理文件传输,以实现并发处理多个客户端请求。 4. **断点续传**:为了提高用户体验,文件传输可能会支持断点续传,即记录已传输的部分,中断后...

    java_chat.zip_Java Chat Netbeans_Java custompanel_java ch_netbea

    1. 多线程处理:由于服务器需要同时处理多个客户端的连接请求,因此通常会使用多线程技术来并发处理。 2. 端口监听:服务器会开启一个特定的TCP端口,等待客户端的连接请求。 3. 数据传输:接收客户端发送的消息,...

    ChatApp_based_on_java .rar_25-1.gif_Java聊天程序_java 聊天_java 聊天程序_j

    ChatApp是基于Java编程语言开发的一款聊天应用程序,...综上所述,ChatApp是一个涵盖了Java GUI、网络编程、多线程、数据序列化等多个关键知识点的项目,对于Java开发者来说,它是提高技能和学习新知识的理想实践案例。

Global site tag (gtag.js) - Google Analytics