`
liuting37
  • 浏览: 9782 次
  • 性别: 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源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    java毕设 Java 毕业设计项目

    java毕设 1. 使用 io 流实现简易图片下载功能 2. socket 实现登录注册文件上传 3. jdbc 实现简易饭卡系统 ...17. 使用 Spring Data JPA 在应用程序中批量插入的示例 18. 使用 spring-boot-admin 对 Spring Boot 服务进

    JAVA文件传输的实现.rar

    Java文件传输的实现可以应用于各个领域,包括但不限于文件备份、文件同步、远程文件访问、在线文档管理等。 在企业级应用中,可以作为分布式系统中的文件传输组件,实现不同节点之间的文件共享和同步。 通过Java文件...

    《Java编程技巧典型案例解析》随书光盘

    实例13 基于Java语言的多线程同步机制 实例14 Java程序中的多线程实现 实例15 利用Java的多线程技术实现并行多任务的管理 实例16 在Win32系统中引导Java程序 实例17 利用Java实现一个非线性规划问题 实例...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 244 10.1.2 设置Locale 249 10.1.3 隔离语言环境相关数据 252 10.1.4 格式化 258 10.2 练习 266 10.2.1 对单独的文件进行国际化 ...

    smart-http 是一款可编程的 Http 应用微内核,基于smart-socket实现的轻量级http服务器

    smart-http 是一款可编程的 Http 应用微内核,基于smart-socket实现的轻量级http服务器,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建...

    深入Java Servlet网络编程

    2 基于Java解决方案的特点 第2章 Java Servlet简介 2. 1 Servlet生命周期 2. 2 Java Servlet API简介 2. 3 处理表单和返回数据的实例 2. 4 错误处理和日志记录 2. 4. 1 Java中的异常处理机制 2. 4. 2 在Java...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 244 10.1.2 设置Locale 249 10.1.3 隔离语言环境相关数据 252 10.1.4 格式化 258 10.2 练习 266 10.2.1 对单独的文件进行国际化 ...

    JAVA 范例大全 光盘 资源

    实例202 简单的JSP上传文件 661 实例203 用Servlet获取Web服务器信息 666 实例204 可选择的图形验证码 670 实例205 简单的页面注册 675 实例206 用Servlet实现分页查看数据库 686 实例207 简单的BBS论坛 697 ...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    [14本经典Android开发教程]-3-Android SDK 中文开发文档

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上使用JaVa语言进行Android应用开发必须的工具和API接口。 特性 · 应用程序...

    androidSocketofOKSocket

    适用于Android应用程序的阻塞套接字客户端。 用其他语言阅读: OkSocket介绍 Android Oksocket Library是基于Java阻塞套接字的套接字客户端解决方案,您可以使用它来开发在线聊天室或数据传输等。 Maven配置 自动...

Global site tag (gtag.js) - Google Analytics