`
liuting37
  • 浏览: 10209 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

基于java sokcet 的上传下载文件应用程序

阅读更多

一、程序功能简介

完成客户端和服务器端文件的传输,客户端向服务器端上传文件,服务器端存在固定的路径下面;客户端从服务器端下载文件,并保存在固定的路径下面。

二、程序用到的知识点

socket连接,线程创建,流的处理,字符串处理,java界面

1.socket连接服务器端

ServerSocket ssocket  =  new ServerSocket(3000);//侦听端口
Socket socket = ssocket.accept();//如果有人连接 这条代码便运行下去。

   socket连接客户端

Socket socket = new Socket(ip,port);//客户端连接服务器,要提供服务器的ip 和端口

 2.流的处理

当数据流在socket中进行传输时,要把它们转成二进制流进行传输。

从本地读取文件流

DataInputStream is = new DataInputStream(new BufferInputStream(new FileInputStream(filepath)));

 从外部读取传输过来的数据流

DataInputStream io = new DataInputStream(socket.getInputStream()); 

向本地输出文件流

DataOutputStream os = new DataOutputStream(new BufferOutputStream(new FileOutputStream(filepath)));

 向外部输出数据流

DataOutputStream out = new DataOutputStream(socket.getOutputStream());

 3.线程的创建方法

new Thread(){
public void run(){
//写入在线程中要执行的代码;
}
}.start();

 4.字符串的处理

If(string.indexOf('@')!=-1){
//判断字符串中是否含有“@”字符
subString(0,string.indexOf("@"));//截取@之前的字符串
subString(string.indexOf("@")+1,string.length());//截取@之后的字符串 length 
要比最后一个字符的索引大1}

 5.java界面

注意现将成员变量列出,静态变量可供全局访问,然后写构造函数,讲成员变量进行布局排列,编辑,添加事件,最后在主函数中调用构造函数,进行显示。大小固定设置setSize(),位置固定设置setBounds();pack();是根据内容自己调整大小,布局分为flowlayout布局 BorderLayout布局GridLayout布局

 

三、程序功能模块及代码

客户端界面

import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.IOException;
import java.net.UnknownHostException;
import javax.swing.*;

public class frame  extends JFrame{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	JLabel lbl_up = new JLabel("上传");                     //定义成员变量
	JTextField textfield1 = new JTextField("请选择上传文件...        ");
	JButton btn_shangchuan  = new JButton("开始上传");
	
	JLabel  lbl_down = new JLabel("下载");
	JTextField textfield2 = new JTextField("请输入下载地址...       ");
	JButton btn_xiazai = new JButton("开始下载");
	static JTextArea textarea = new JTextArea(15,25);
	
    ActionListener downloadListener=new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			String url = textfield2.getText();
			if(url.indexOf("@")!=-1){
			String ip = url.substring(0, url.indexOf("@"));
			String path = url.substring(url.indexOf("@")+1,url.length());
			new Download(ip,path,"C:\\download");
			}
		}
	};
	
	ActionListener uploadListener=new ActionListener(){
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			
				try {
					
					String url = textfield1.getText();
					System.out.println(url);
					if(url.indexOf("@")!=-1){
					String ip = url.substring(0,url.indexOf("@"));
					String path = url.substring(url.indexOf('@')+1,url.length());
					System.out.println(ip);
					System.out.println(path);
					new upload(path,ip,3000);
					
					textarea.setText("文件已上传成功!");
					}else{
						textarea.setText("请输入正确下载地址,格式为:'ip@c:\\..'");
					}
					System.out.println("c:\\abc");
					
				} catch (UnknownHostException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		
		
	}; 
	public frame(){                               //构造函数
		textarea.setLineWrap(true);
		 setSize(300, 400);   //设置大小
		 setResizable(false); //固定大小,不能改变
		setLayout(new FlowLayout(0));//设置布局为flowlayout类型
		textfield1.setEditable(true);
		btn_shangchuan.addActionListener(uploadListener);
		btn_xiazai.addActionListener(downloadListener);     

		 JPanel panel_up =new JPanel();
		 JPanel panel_down = new JPanel();
		 JPanel panel_state = new JPanel();
		 panel_up.add(lbl_up);
		 panel_up.add(textfield1);
		 panel_up.add(btn_shangchuan);
		 panel_down.add(lbl_down);
		 panel_down.add(textfield2);
		 panel_down.add(btn_xiazai);
		 panel_state.add(textarea);
		 
		 
		 getContentPane().add(panel_up); //把控件放到一个panel中,然后服从flowlayout布局
		 getContentPane().add(panel_down);
		 getContentPane().add(panel_state);

		 }
		 

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		frame fm = new  frame();
		fm.setDefaultCloseOperation(EXIT_ON_CLOSE); //当界面被关闭时,程序退出。
		fm.setVisible(true);                         //显示界面
		

	}

}

 

 

客户端上传部分

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
public class upload {

	private void socket(String filepath,String address, int port) throws UnknownHostException, IOException {
      	Socket sock = new Socket(address, port);
		DataOutputStream os = null;
		DataInputStream is = null;
		os = new DataOutputStream(sock.getOutputStream());
		is = new DataInputStream(new BufferedInputStream(new FileInputStream(filepath)));
		File file = new File(filepath);
		System.out.println("发送前;"+file.getName());
		os.writeByte(0);//标志上传 与下载区分;
		os.writeUTF(file.getName());  //用这种方法写出去 然后再用这种方法读粗来。。。
		System.out.println(file.getName());
		os.writeLong(file.length());
		
		int bufferSize = 8192;
		byte[] bt = new byte[bufferSize];

		while(true){
			System.out.println("文件在传输中");
			
			int read = 0;
			if(is != null){
			read = is.read(bt);
			}
			if(read !=-1){
				os.write(bt,0,read);
			}
			if(read ==-1){
				break;
			}
		}
		is.close();
		os.flush();
		sock.close();
		System.out.println("\n文件已上传成功!");
	}
	
	
	public upload(String filepath,String address, int port) throws UnknownHostException, IOException{
		
		socket(filepath,address, port);
		
		
	}
}

 

客户端下载部分

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
public class Download {

	public Download(String ip, String path,String savepath) {
		// TODO Auto-generated constructor stub
		
		try {
			Socket sock  = new Socket(ip,3000);
	        DataOutputStream os = new DataOutputStream(sock.getOutputStream());
	        DataInputStream is = new DataInputStream(sock.getInputStream());
	        os.writeByte(1);    
	        os.writeUTF(path);
	        String fileName = is.readUTF();
	        savepath += "\\"+fileName;
	        Long fileLength = is.readLong();
	        int bufferSize = 8192;
	        byte[] bf = new byte[bufferSize];
	        DataOutputStream fsv = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savepath)));
	        while(true){
	        	if(fileLength>0){
	        		is.read(bf);
	        		fsv.write(bf);
                    fileLength -= bufferSize;	        		
	        		
	        		
	        	}else{
	        		break;
	        	}
	        	
	        }
	        fsv.flush();
	        fsv.close();
	        is.close();
	        os.close();
	        sock.close();
	        frame.textarea.append("文件已下载成功!保存路径为"+savepath);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

服务器端

界面

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextArea;
public class frame extends JFrame{
	private static final long serialVersionUID = 1L;
	 static JFrame frame =new JFrame("Server");
	 static JButton button = new JButton("开始连接");
	 static JTextArea textarea = new JTextArea(15,20);
	 
	 public frame(){
		 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		 frame.setLayout(new BorderLayout());
		 frame.setBounds(700, 200, 350, 400);  //固定界面显示位置
		 button.setSize(80,60);
		 button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("等待连接");
		        new server();
			
			}
		});

		
		 textarea.setLineWrap(true);
		 frame.getContentPane().add(button,BorderLayout.NORTH);
		 frame.getContentPane().add(textarea,BorderLayout.SOUTH);
		 
	 }
	
	public static void main(String[] args) {
      new  frame();
	 frame.setVisible(true);

	}	

}

 服务器端功能

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
	String savepath = null;
	ServerSocket serverSocket;
	Socket socket;
	InputStream inputStream;
	OutputStream outputStream;
	int bufferSize = 8192;
public  server(){
	System.out.println("进来了");
	System.out.println(":wtf");
	try {
		serverSocket = new ServerSocket(3000);
	} catch (IOException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
	new Thread(){
		
	  public void	run(){
		  while(true){
		  try {
                frame.textarea.append("\n等待连接..");
				Socket ssock = serverSocket.accept();
				frame.textarea.append("\n连接已创建");
				System.out.println("连接已创建");
				DataInputStream io = new DataInputStream(new BufferedInputStream(ssock.getInputStream())); 
				
				if(io.readByte()==0){
				
				String fileName = io.readUTF();  //这是一个神奇的方法  用什么方法传 就会用什么方法 读粗来。。。
			    Long length  = io.readLong();
			    savepath = "c:\\bcd\\"+fileName;
				System.out.println(fileName);
				System.out.println(length);
				byte[] buf = new byte[bufferSize];

					DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savepath)));
					
				while(true){
					 int read = 0;
					if(length > 0){
						read = io.read(buf);
						length -= bufferSize;
						out.write(buf,0,read);
					}
					else
					{
                       io.close();	
                       out.close();
						break;
					}
					
				}
				System.out.println("文件已接收成功!");
				frame.textarea.append("\n 文件已上传成功!保存路径为"+savepath);
				}else{                                //下载功能
					String path = io.readUTF();
					System.out.println(path);
				    File file = new File(path);
				    DataOutputStream os = new DataOutputStream(ssock.getOutputStream());
					DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(path)));
			     
					os.writeUTF(file.getName());
					os.writeLong(file.length());
					byte[] buf  = new byte[bufferSize];
					
					while(true){
                                          int read = 0;
                                          if(is!=null){
  	                                                         read = is.read(buf);
  	                                                         if(read !=-1){
  	                                                         os.write(buf,0,read);
  	                                                         }else{
  	                                                             is.close();
  	                                            	             os.flush();
  	                                            	             os.close();
  	                                            	             System.out.println("资源下载成功");
  	                                            	             frame.textarea.append("\n资源被下载");
					                                              break;
  	                                                                     }
                                            }else 
                                            {
                                                System.out.println("所找资源不存在");
                                            	break;
                                            }
                                          }
				}	
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
	  }
	  
	}.start();

	}
}

四、程序有待完善的部分

代码健壮性不强,上传下载文件必须是已知路径存在,否则程序不能继续运行下去,在上传时如果能写成浏览本地文件的功能就好了,在服务器端有固定的存储上传文件的路径如果路径不存在,可以自行创建路径就好了;下载功能同样是这样,但是浏览服务器上的文件似乎有些难度,进行本地存储是跟服务器端上传文件存储一样的。

 

分享到:
评论

相关推荐

    JAVA Socket编程实现文件上传

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...

    java中基于socket的文件上传程序

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出以下关于“Java中基于Socket的文件上传程序”的相关知识点。 ### 一、基础知识介绍 #### 1. Socket编程基础 - **概念**:Socket(套接字)是网络通信...

    基于Java Swing 的带有文件上传和下载的聊天室

    【Java Swing 文件上传和下载聊天室】是一个使用Java Swing库构建的本地客户端-服务器应用程序,它允许用户进行实时聊天并交换文件。这个项目的核心技术包括Java的网络编程、图形用户界面设计以及文件处理。 首先,...

    JAVA基于Socket编写的Ftp程序

    总结起来,这个项目是一个Java实现的FTP服务器和客户端应用程序,利用Socket进行网络通信,同时服务端具有用户界面,提高了用户体验。通过这个项目,开发者可以深入理解Java网络编程、FTP协议的实现以及客户端-...

    Java 基于Swing的FTP上传下载程序

    Java基于Swing的FTP上传下载程序是一个用户界面友好、功能完备的应用,主要用于通过FTP(File Transfer Protocol)协议实现文件的上传和下载。Swing是Java提供的一个轻量级的GUI库,它允许开发者创建出美观且功能...

    基于socket的文件传输

    在IT行业中,网络通信是至关重要的一个领域,而Socket编程是构建网络应用程序的基础。本项目“基于socket的文件传输”是针对Java Socket编程的一次实战练习,旨在实现单方文件的传输功能。在这个过程中,我们将深入...

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

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

    android使用socket上传、下载文件

    Socket提供了一种可靠的、基于连接的传输层通信机制,适用于文件的上传和下载。本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议...

    java-socket大文件上传-含客户端和服务端

    Socket是一种基于TCP/IP协议的通信方式,它为两台机器间的应用程序提供了一种直接的、低级别的连接。当创建一个Socket时,客户端和服务器端都会建立一个套接字,它们之间通过这个套接字进行数据传输。TCP保证了数据...

    java socket 文件上传(客户端服务器 )无界面

    Java Socket 是一种网络通信协议,它允许两个网络应用程序之间建立全双工的、独立的数据连接。在这个场景中,我们讨论的是使用Java Socket实现一个无界面的文件上传功能,即客户端将文件发送到服务器,服务器接收并...

    基于Java Socket的机房文件收发系统探讨与实现.pdf

    在本文档中,我们讨论了一个基于Java Socket实现的机房文件收发系统,该系统旨在解决高校教师在机房进行实践教学时发送和回收电子化作业及试卷的需求。 传统的文件收发方式,如共享服务器目录或使用FTP服务器,存在...

    基于socket的用户注册,登录,文件上传

    1. **Java Socket**: Java Socket是Java提供的网络通信接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在本项目中,Socket用于建立客户端与服务器端的连接,实现数据的双向传输。客户端通过创建Socket对象...

    socket实现文件上传下载

    本文将详细介绍如何利用 Java 的 Socket 编程实现文件的上传与下载。 #### 二、Socket 基础 在深入了解文件传输之前,我们先简要回顾一下 Socket 的基础知识。Socket 是一种用于网络通信的机制,它使得不同计算机...

    java socket 学习资料

    Socket在Java中被广泛用于构建客户端-服务器应用,例如创建Web服务器、聊天应用程序、文件传输等。以下是一些关于Java Socket的重要知识点: 1. **Socket类与ServerSocket类**: - `Socket`类代表网络通信中的...

    Java Socket IO Thread 整合大文件与上传下载

    Java Socket IO Thread 整合大文件与上传下载是网络编程中的一个重要应用场景,特别是在处理大量数据交换时,如文件传输。Socket提供了低级别的网络通信接口,IO(Input/Output)用于处理数据流,而线程(Thread)则...

    java socket 聊天程序

    Java Socket聊天程序是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过互联网进行双向通信。在这个场景中,我们不仅实现了基本的文字聊天功能,还扩展到了文件传输和文件加密,其中文件加密采用了DES(Data...

    javaftpclient.zip_Java FTP上传_swing 上传_swing上传下载_swing文件上传

    Java FTP客户端是一个基于Swing图形用户界面(GUI)的应用程序,用于实现文件的上传和下载功能。这个项目的核心是利用Java的FTP库来与FTP服务器进行通信,Swing则提供了友好的用户交互界面。在本项目中,用户可以...

    java 文件上传下载 断点续传 断点上传

    在Java编程中,文件上传和下载是常见的任务,特别是在Web应用程序和分布式系统中。断点续传功能则进一步提高了文件传输的效率和用户体验,尤其是在处理大文件时。本项目提供了两种实现方式,一种是基于Web端的上传...

    socket文件上传代码

    本示例中的"socket文件上传代码"是一种使用Java语言通过Socket协议实现在不同服务器间上传文件的技术。Socket,又称为套接字,是网络编程中进程间通信(IPC)的一种方式,尤其适用于跨网络的客户端-服务器架构。 ...

    java与c++传文件程序

    本项目实现了一个基于Socket的文件传输方案,其中Java作为服务端,C++作为客户端,使得Windows环境下的文件能够在两个程序之间安全、高效地传递。以下是对这个程序设计和实现的关键知识点的详细说明: 1. **Java ...

Global site tag (gtag.js) - Google Analytics