`
随便小屋
  • 浏览: 105954 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java Socket 多线程实现文件传输

    博客分类:
  • JAVA
阅读更多

        高级操作系统作业,让用Socket实现文件传输,有些代码也是在网上找的,写的不好,如果大家能用就用上。

客户端类:

 

package edu.logic.client;

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.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import edu.logic.common.Transmission;
import edu.logic.constant.Constant;

/**
 * 客户端类
 * @author Logic Luo
 */
public class Client {
	
	//用于从文件中读取要上传的数据
	DataInputStream dataInputStreamUploade = null;
	//用于向socket中写入数据
	DataOutputStream dataOutputStreamUploade = null;
	//用于接收从socket传来的数据
	DataInputStream dataInputStreamReceive = null;
	//用于向客户端文件中写数据
	DataOutputStream dataOutputStreamReceive = null;
	
	/**
	 * 客户端开始程序
	 * @throws UnknownHostException
	 * @throws IOException
	 */
	@SuppressWarnings("resource")
	public void start() throws UnknownHostException, IOException {
		while(true) {
			System.out.println("请按照以下格式书写命令:\n上传文件:put 本地文件名 服务器文件名\n下载文件:get 服务器文件名 本地文件名");
			String localFileName = null;
			String remoteFileName = null;
			Scanner scanner = new Scanner(System.in);
			String command = scanner.nextLine();
			//命令解析
			String[] commandArray = command.split(" ");
			Socket socket = null;
			int flag = 0;
			
			//命令解析
			if(commandArray[0].equals("put")) {
				flag = 0;
				localFileName = commandArray[1];
				remoteFileName = commandArray[2];
			} else {
				flag = 1;
				localFileName = commandArray[2];
				remoteFileName = commandArray[1];
			}
			
			//创建socket,向服务器端发送链接请求 
			socket = new Socket(Constant.HOSTIP, Constant.PORT);
			
			dataOutputStreamUploade = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
			//向服务器端发送上传或下载标志
			dataOutputStreamUploade.writeInt(flag);
			dataOutputStreamUploade.flush();
			//想服务器端发送远程文件名
			dataOutputStreamUploade.writeUTF(remoteFileName);
			dataOutputStreamUploade.flush();
			if(flag == 0) {
			//向服务器端发送文件名称
			put(localFileName, dataOutputStreamUploade);
			dataOutputStreamUploade.close();
System.out.println("客户端上传数据完成");
			} else {
				dataInputStreamReceive = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
				get(localFileName, dataInputStreamReceive);
System.out.println("客户端数据接收完成");
				dataInputStreamReceive.close();
			}
			dataOutputStreamUploade.close();
			socket.close();
			System.out.println("File transfer complete");
		}
	}
	
	/**
	 * 从客户端向服务器上传数据
	 * @param fileName 客户端文件名
	 * @param dataOutputStreamUploade
	 * @throws IOException
	 */
	public void put(String fileName, DataOutputStream dataOutputStreamUploade) throws IOException {
		File file = new File(Constant.CLIENTFOLDER + fileName);
		//创建文件输入流
		dataInputStreamUploade = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
		Transmission transmission = new Transmission(dataInputStreamUploade, dataOutputStreamUploade);
		transmission.transmitData();
		dataInputStreamUploade.close();
	}
	
	/**
	 * 从服务器向客户端下载数据
	 * @param fileName 客户端文件名
	 * @param dataInputStreamReceive socket接收数据的输入流
	 * @throws IOException
	 */
	public void get(String fileName, DataInputStream dataInputStreamReceive) throws IOException {
		//创建文件输出流
		dataOutputStreamReceive = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(Constant.CLIENTFOLDER + fileName))));
		Transmission transmission = new Transmission(dataInputStreamReceive, dataOutputStreamReceive);
		transmission.transmitData();
		dataOutputStreamReceive.close();
		dataInputStreamReceive.close();
	}
	
	public static void main(String[] args) throws Exception {
		new Client().start();
	}
}

 服务器类:

 

 

package edu.logic.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import edu.logic.constant.Constant;
/**
 * Server类
 * @author Logic Luo
 */
public class Server extends Thread{
	private Socket socket = null;
	private ServerSocket serverSocket = null;
	public static int count = 0;
	
	/**
	 * 无参构造函数
	 */
	public Server(){
		try {
			serverSocket = new ServerSocket(Constant.PORT);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(true) {
			System.out.println("进行socket监听!");
			try {
				//获监听过来的socket
				socket = serverSocket.accept();
				System.out.println(count++);
				new ServerThread(socket).start();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 主函数 
	 * @param args
	 */
	public static void main(String[] args) {
		new Server().start();
	}

}

 服务器端多线程实现数据传输:

 

 

package edu.logic.server;

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.FileOutputStream;
import java.io.IOException;
import java.net.Socket;

import edu.logic.common.Transmission;
import edu.logic.constant.Constant;

/**
 * 处理文件的上传和下载
 * @author Logic Luo
 */
public class ServerThread extends Thread {
	private Socket socket = null;
	// 用于接受送客户端传来的文件
	private DataInputStream dataInputStreamReceive = null;

	// 用于向服务器写文件
	private DataOutputStream dataOutputStreamReceive = null;
	
	//用于向客户端发送文件时读取服务器文件的内容
	private DataInputStream dataInputStreamUpload = null;
	
	//用于向客户端发送文件时,向socket写入文件
	private DataOutputStream dataOutputStreamUpload = null; 
	/**
	 * 默认无参构造函数
	 */
	public ServerThread() {}

	/**
	 * 以socket为参数的构造函数
	 * @param socket
	 */
	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	
	/**
	 * 服务器端开始程序
	 * @throws IOException
	 */
	@Override
	public void run() {
		// 创建服务器端ServerSocket
		try {
			dataInputStreamReceive = new DataInputStream(new BufferedInputStream(
					socket.getInputStream()));
			
			//接收从服务器端传来的标志位是上传还是下载
			int flag = dataInputStreamReceive.readInt();
			//读取传过来的文件名
			String fileName = dataInputStreamReceive.readUTF();
			
			if(0 == flag) {
				receive(fileName, dataInputStreamReceive);
	System.out.println("服务器端接收数据完成");
				dataInputStreamReceive.close();
			} else {
				dataOutputStreamUpload = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
				upload(fileName, dataOutputStreamUpload);
				dataInputStreamUpload.close();
	System.out.println("服务器端上传数据完成");
				dataInputStreamReceive.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//关闭socket
			if(socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 接收从客户端传过来的文件
	 * @param fileName 服务器端文件名称
	 * @param dataInputStreamReceive 从socket接收数据的输入流
	 * @throws IOException
	 */
	public void receive(String fileName, DataInputStream dataInputStreamReceive) throws IOException {
		String filePath = Constant.SERVERFOLDER + fileName;
		dataOutputStreamReceive = new DataOutputStream(new BufferedOutputStream(
				new FileOutputStream(new File(filePath))));
		Transmission transmission = new Transmission(dataInputStreamReceive,
				dataOutputStreamReceive);
		transmission.transmitData();
		dataOutputStreamReceive.close();
		System.out.println("文件上传成功");
	}
	
	/**
	 * 从服务器端向客户端发送文件
	 * @param fileName 本地文件名
	 * @param dataOutputStreamUpload 向socket发送数据的输出流
	 * @throws IOException
	 */
	public void upload(String fileName, DataOutputStream dataOutputStreamUpload) throws IOException {
		dataInputStreamUpload = new DataInputStream(new BufferedInputStream(new FileInputStream(new File(Constant.SERVERFOLDER + fileName))));
		Transmission transmission = new Transmission(dataInputStreamUpload, dataOutputStreamUpload);
		transmission.transmitData();
		dataInputStreamUpload.close();
	}
	
}

 文件传输:

 

 

package edu.logic.common;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

/**
 * 用于文件传输
 * @author Logic Luo
 */
public class Transmission {
	private DataInputStream sourceStream = null;
	private DataOutputStream destinationStream = null;

	public Transmission(){}
	
	/**
	 * 根据数据流的构造函数
	 * @param sourceStream
	 * @param destinationStream
	 */
	public Transmission(DataInputStream sourceStream,
			DataOutputStream destinationStream) {
		this.sourceStream = sourceStream;
		this.destinationStream = destinationStream;
	}

	/**
	 * 数据传输
	 * @throws IOException
	 */
	public void transmitData() throws IOException {
		int bufferSize = 8192;
		byte[] buffer = new byte[bufferSize]; 
		while(true) {
			int readSize = 0;
			if(sourceStream != null ) {
				readSize = sourceStream.read(buffer);
			}
			if(readSize == -1) {
				break;
			}
			destinationStream.write(buffer, 0, readSize);
		}
		destinationStream.flush();
	}
}

 

 

用到的一些常量类

 

package edu.logic.constant;

/**
 * 程序中所用到的一些常量
 * @author Logic Luo
 */
public class Constant {
	//服务器IP
	public static String HOSTIP = "127.0.0.1";
	
	//服务器端口号
	public static int PORT = 8081;
	
	//客户端文件目录
	public static String CLIENTFOLDER = "C:/Users/Logic/workspace/FileTransmit02/src/clientfolder/";
	
	//服务器端文件目录
	public static String SERVERFOLDER = "C:/Users/Logic/workspace/FileTransmit02/src/serverfolder/";
}

 

 

整个项目在附件中,需要的可以下载一下,运行的时候记得修改一下Constant类中的CLIENTFOLDER和SERVERFOLDER两个变量。

0
0
分享到:
评论

相关推荐

    java socket多线程文件传输实例项目

    Java Socket多线程文件传输实例项目是一个典型的网络编程应用场景,主要涉及了Socket编程、多线程处理以及文件I/O操作等关键知识点。在这个项目中,开发者利用Java的Socket API实现了一个能够支持多个客户端同时进行...

    JAVA Socket编程实现文件上传

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

    java socket 多线程网络传输多个文件

    java socket 多线程网络传输多个文件

    java socket 多线程实例

    在这个“Java Socket 多线程实例”中,我们将会探讨如何结合这两个关键概念来创建一个聊天服务器和客户端应用。 首先,`ChatServer.java` 文件通常包含了服务器端的代码。在Java中,通过`java.net.ServerSocket` 类...

    java socket多线程文件上传下载实例项目

    Java Socket多线程文件上传下载实例项目是一种基于Java网络编程技术实现的,旨在处理大量并发连接的文件传输服务。在本项目中,Socket是客户端与服务器之间通信的基础,它允许两个应用程序通过网络交换数据。多线程...

    java socket 多线程并发控制 hibernate mysql

    本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...

    java利用Socket与多线程实现网络聊天室

    服务端知识进行连接 之后调用服务端的线程 服务端并没有大的改动,在原有的基础上加上线程池, 客户端界面只有简单的传一个...调用客户端的方法,方法中有线程,线程中进行socket的链接,这样才能实现多个文件的传输。

    java,socket多线程一对一聊天

    在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...

    socket做的支持多线程断点上传or断点续传Java源码

    标题中的“socket做的支持多线程断点上传or断点续传Java源码”涉及到的是在网络编程中,如何使用Java的Socket API实现一个能够处理断点上传和断点续传功能的服务。这是一个高级的网络编程任务,通常在大型文件传输...

    java socket 多线程 断点续传实现

    最近研究了一下socket套接字 实现java多线程 断点续传文件 在网上查找了很多例子 然后学习了大家的方法 最后利用网上的例子 自己整合了一份多线程 断点续传文件的代码 并且能实现客户端发送完毕之后 接收服务器端的...

    java socket 多线程通讯示例

    总的来说,Java Socket多线程通信是一种强大的工具,用于构建分布式系统和网络应用。理解如何创建和管理Socket连接,以及如何在多线程环境下处理这些连接,是成为熟练的Java网络程序员的关键步骤。通过实践和理解...

    java多线程Socket简单实现

    通过这种方式,Java多线程Socket实现可以构建出高并发、实时交互的网络应用,如聊天室、文件传输等。然而,实际开发中还需要考虑异常处理、资源管理、网络延迟等因素,以确保系统的稳定性和可靠性。同时,为了提高...

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

    在Java编程中,Socket通信是网络应用程序之间进行数据交换的基础,尤其在文件传输...总的来说,使用Java的Socket和多线程技术实现文件夹传输是一项复杂的任务,需要掌握网络编程、多线程、文件操作等多个方面的知识。

    socket多线程文件上传下载实例

    在Java编程中,Socket...综上所述,这个Java Socket多线程文件上传下载实例涵盖了Socket通信、多线程处理以及文件操作等多个核心概念。通过实践这个实例,开发者可以深入理解网络编程和并发处理在实际应用中的运用。

    java socket传输各种格式文件

    2. **并发处理**:对于大文件,可以考虑分块传输,多个线程并发处理,提高传输效率。 3. **压缩技术**:传输前先对文件进行压缩,如使用GZIPOutputStream和GZIPInputStream,减小传输数据量,加快传输速度。 六、...

    java多线程文件传输(基于swing)

    **打包生成的jar文件**(多线程传输.jar)是一个可执行的Java程序,包含了项目的所有类和资源,用户可以直接运行它,无需编译源代码。而FileTransfer.zip可能是项目源代码的压缩包,包含.java文件和其他必要的配置...

    java socket多线程聊天

    Java Socket多线程聊天程序是一种实现网络通信的基本方式,它基于TCP/IP协议,允许两台计算机之间进行双向数据传输。在这个简单的两人对话程序中,我们主要涉及到以下知识点: 1. **Socket**: Java中的Socket类是...

    Java Socket聊天和文件传输工具

    这个Java Socket工具的实现涉及到了网络编程、多线程、I/O流和文件操作等多个Java核心技术,对于学习和理解Java网络编程有很好的实践价值。如果你对这些技术感兴趣,可以通过编写自己的Socket程序进行实践,加深理解...

Global site tag (gtag.js) - Google Analytics