精华内容
参与话题
问答
  • Java Socket实现文件传输

    万次阅读 多人点赞 2016-09-01 17:00:26
    A:1核2GB1M服务器年86元 B:1核2GB1M服务器三年229元 C:2核4GB3M服务器三年799元(强烈推荐) D:2核8GB5M服务器三年1399元 ...最近学Socket学上瘾了,就写了一个简单的文件传输程序。 客户端设计思路:客户...

    阿里云双11服务器优惠(年度最佳优惠):
    A:1核2GB 1M 服务器年84元
    B:1核2GB 1M 服务器三年254元
    C:2核4GB 3M 服务器三年664元(强烈推荐)
    D:4核8GB 5M 服务器三年3001元
    以上均需新人才可以参加,同时还有企业专享服务器年2575元。
    活动地址:https://tb.am/6jbfl

     

    最近学Socket学上瘾了,就写了一个简单的文件传输程序。

    客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端。传输的进度打印到控制台中,直到传输完成。

    服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名。
    下面是客户端和服务端的代码实现:

     

    客户端代码:

     

    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.Socket;
    
    /**
     * 文件传输Client端<br>
     * 功能说明:
     *
     * @author 大智若愚的小懂
     * @Date 2016年09月01日
     * @version 1.0
     */
    public class FileTransferClient extends Socket {
    
        private static final String SERVER_IP = "127.0.0.1"; // 服务端IP
        private static final int SERVER_PORT = 8899; // 服务端端口
    
        private Socket client;
    
        private FileInputStream fis;
    
        private DataOutputStream dos;
    
        /**
         * 构造函数<br/>
         * 与服务器建立连接
         * @throws Exception
         */
        public FileTransferClient() throws Exception {
            super(SERVER_IP, SERVER_PORT);
            this.client = this;
            System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功连接服务端");
        }
    
        /**
         * 向服务端传输文件
         * @throws Exception
         */
        public void sendFile() throws Exception {
            try {
                File file = new File("E:\\JDK1.6中文参考手册(JDK_API_1_6_zh_CN).CHM");
                if(file.exists()) {
                    fis = new FileInputStream(file);
                    dos = new DataOutputStream(client.getOutputStream());
    
                    // 文件名和长度
                    dos.writeUTF(file.getName());
                    dos.flush();
                    dos.writeLong(file.length());
                    dos.flush();
    
                    // 开始传输文件
                    System.out.println("======== 开始传输文件 ========");
                    byte[] bytes = new byte[1024];
                    int length = 0;
                    long progress = 0;
                    while((length = fis.read(bytes, 0, bytes.length)) != -1) {
                        dos.write(bytes, 0, length);
                        dos.flush();
                        progress += length;
                        System.out.print("| " + (100*progress/file.length()) + "% |");
                    }
                    System.out.println();
                    System.out.println("======== 文件传输成功 ========");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(fis != null)
                    fis.close();
                if(dos != null)
                    dos.close();
                client.close();
            }
        }
    
        /**
         * 入口
         * @param args
         */
        public static void main(String[] args) {
            try {
                FileTransferClient client = new FileTransferClient(); // 启动客户端连接
                client.sendFile(); // 传输文件
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

     

     

    服务端代码:

     

    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.math.RoundingMode;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.DecimalFormat;
    
    /**
     * 文件传输Server端<br>
     * 功能说明:
     *
     * @author 大智若愚的小懂
     * @Date 2016年09月01日
     * @version 1.0
     */
    public class FileTransferServer extends ServerSocket {
    
        private static final int SERVER_PORT = 8899; // 服务端端口
    
        private static DecimalFormat df = null;
    
        static {
            // 设置数字格式,保留一位有效小数
            df = new DecimalFormat("#0.0");
            df.setRoundingMode(RoundingMode.HALF_UP);
            df.setMinimumFractionDigits(1);
            df.setMaximumFractionDigits(1);
        }
    
        public FileTransferServer() throws Exception {
            super(SERVER_PORT);
        }
    
        /**
         * 使用线程处理每个客户端传输的文件
         * @throws Exception
         */
        public void load() throws Exception {
            while (true) {
                // server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
                Socket socket = this.accept();
                /**
                 * 我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后,
                 * 都要先跟当前的客户端通信完之后才能再处理下一个连接请求。 这在并发比较多的情况下会严重影响程序的性能,
                 * 为此,我们可以把它改为如下这种异步处理与客户端通信的方式
                 */
                // 每接收到一个Socket就建立一个新的线程来处理它
                new Thread(new Task(socket)).start();
            }
        }
    
        /**
         * 处理客户端传输过来的文件线程类
         */
        class Task implements Runnable {
    
            private Socket socket;
    
            private DataInputStream dis;
    
            private FileOutputStream fos;
    
            public Task(Socket socket) {
                this.socket = socket;
            }
    
            @Override
            public void run() {
                try {
                    dis = new DataInputStream(socket.getInputStream());
    
                    // 文件名和长度
                    String fileName = dis.readUTF();
                    long fileLength = dis.readLong();
                    File directory = new File("D:\\FTCache");
                    if(!directory.exists()) {
                        directory.mkdir();
                    }
                    File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
                    fos = new FileOutputStream(file);
    
                    // 开始接收文件
                    byte[] bytes = new byte[1024];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                        fos.write(bytes, 0, length);
                        fos.flush();
                    }
                    System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if(fos != null)
                            fos.close();
                        if(dis != null)
                            dis.close();
                        socket.close();
                    } catch (Exception e) {}
                }
            }
        }
    
        /**
         * 格式化文件大小
         * @param length
         * @return
         */
        private String getFormatFileSize(long length) {
            double size = ((double) length) / (1 << 30);
            if(size >= 1) {
                return df.format(size) + "GB";
            }
            size = ((double) length) / (1 << 20);
            if(size >= 1) {
                return df.format(size) + "MB";
            }
            size = ((double) length) / (1 << 10);
            if(size >= 1) {
                return df.format(size) + "KB";
            }
            return length + "B";
        }
    
        /**
         * 入口
         * @param args
         */
        public static void main(String[] args) {
            try {
                FileTransferServer server = new FileTransferServer(); // 启动服务端
                server.load();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     

     

     

    测试的结果(客户端):

    测试的结果(服务端):

     

     

    展开全文
  • android socket局域网文件传输

    热门讨论 2013-11-11 11:31:29
    android socket局域网文件传输 代码 可以在局域网内接收文件 发送文件等 配合 “C#socket局域网文件传输电脑端” 可使电脑和安卓手机之间在局域网内传输文件
  • java 基于Socket局域网文件传输v1.3

    万次阅读 2018-06-16 16:49:47
    为什么我会做这个软件呢因为我们宿舍喜欢打打求生之路 安装第三方地图的时候一般都是一人下载 然后通过QQ发给其他人QQ传输速度太慢,于是开发了这个软件时间2018.1.11发送.javapackage v1_3; import java.awt....

    为什么我会做这个软件呢

    因为我们宿舍喜欢打打求生之路 安装第三方地图的时候一般都是一人下载 然后通过QQ发给其他人

    QQ传输速度太慢,于是开发了这个软件

    时间2018.1.11

    发送.java

    package v1_3;
    
    import java.awt.Component;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    
    import java.awt.Font;
    import java.awt.Graphics;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.awt.event.ActionEvent;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.awt.dnd.DropTarget;
    import java.awt.dnd.DropTargetAdapter;
    import java.awt.dnd.DropTargetDropEvent;
    import java.awt.Color;
    
    public class 发送 extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField textField;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					发送 frame = new 发送(null);
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public static 发送 发送;
    	public static String mulu;
    	public 发送(Component toto) {
    		setResizable(false);
    		setTitle("\u5C40\u57DF\u7F51\u6587\u4EF6\u4F20\u8F93-\u53D1\u9001\u65B9V1.2");
    		发送=this;
    		this.addWindowListener(new WindowAdapter() {
    			public void windowClosing(WindowEvent arg0) {
    				super.windowClosing(arg0);
    				if(fasong.list.size()>0){
    //					javax.swing.JOptionPane.showMessageDialog(发送.this, "正在传输文件请稍后再试");
    					try {
    						Message dialog = new Message(发送.this, "正在传输文件请稍后再试...",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    				}
    				else{
    					System.exit(0);
    				}
    			}
    		});
    		setDefaultCloseOperation(0);
    		setBounds(100, 100, 450, 300);
    		setLocationRelativeTo(toto);
    		setLocation(this.getX()-this.getWidth()/2, this.getY());
    		contentPane = new JPanel();
    		contentPane.setBackground(Color.WHITE);
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		textField = new JTextField();
    		textField.setBackground(Color.WHITE);
    		textField.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		textField.setEditable(false);
    		textField.setBounds(10, 194, 414, 21);
    		contentPane.add(textField);
    		textField.setColumns(10);
    		
    		JLabel label = new JLabel("\u6587\u4EF6\u8DEF\u5F84\uFF1A(\u628A\u6587\u4EF6\u62D6\u5230\u8FD9\u91CC)");
    		label.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		label.setBounds(10, 169, 213, 15);
    		contentPane.add(label);
    		
    //		JButton btnNewButton = new JButton("\u6D4F\u89C8");
    //		btnNewButton.setBackground(Color.WHITE);
    //		btnNewButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    //		btnNewButton.addActionListener(new ActionListener() {
    //			public void actionPerformed(ActionEvent e) {
    //				JFileChooser jf = new JFileChooser();
    //				if (jf.showOpenDialog(null) == 0) {
    //					mulu = jf.getSelectedFile().getPath();
    //					textField.setText(mulu);
    //				}
    //			}
    //		});
    //		btnNewButton.setBounds(350, 193, 74, 23);
    //		contentPane.add(btnNewButton);
    		
    		JButton button = new JButton("\u53D1\u9001");
    		button.setBackground(Color.WHITE);
    		button.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				if(textField.getText().equals("")){
    //					javax.swing.JOptionPane.showMessageDialog(发送.this, "请设置文件路径...");
    					try {
    						Message dialog = new Message(发送.this, "请设置文件路径...",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    				}
    				else if(fasong.list.size()>0){
    //					javax.swing.JOptionPane.showMessageDialog(发送.this, "正在传输文件请稍后再试");
    					try {
    						Message dialog = new Message(发送.this, "正在传输文件请稍后再试",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    				}
    				else{//
    					File fi=new File(textField.getText());
    					if(!fi.isFile()){
    //						javax.swing.JOptionPane.showMessageDialog(发送.this, "非法文件 请重新选择");
    						try {
    							Message dialog = new Message(发送.this, "非法文件 请重新选择",278,129);
    							dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    							dialog.setVisible(true);
    						} catch (Exception ee) {
    							ee.printStackTrace();
    						}
    						return;
    					}
    					///
    					Socket so=null;
    					for(int i=0;i<fwq.list.size();i++){
    						so=fwq.list.get(i);
    						new Thread(new fasong(so)).start();
    					}
    					new Thread(new drawaaa()).start();
    					
    				}
    			}
    		});
    		button.setBounds(331, 228, 93, 23);
    		contentPane.add(button);
    		
    		JLabel lblNewLabel = new JLabel("\u8BF7\u8BA9\u5BF9\u65B9\u8FDE\u63A5\u5230\u60A8\u7684IP\uFF1A");
    		lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 16));
    		lblNewLabel.setBounds(10, 128, 414, 31);
    		contentPane.add(lblNewLabel);
    		
    		String s=null;
    		try {
    			s = "" + InetAddress.getLocalHost();
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		}
    		StringBuffer ss = new StringBuffer();
    		try {
    			for (int i = s.indexOf("192"); i < s.length(); i++) {
    				ss.append(s.charAt(i));
    			}
    		} catch (Exception e1) {
    			e1.printStackTrace();
    		}
    		lblNewLabel.setText("\u8BF7\u8BA9\u5BF9\u65B9\u8FDE\u63A5\u5230\u60A8\u7684IP\uFF1A" + ss);
    		label_1.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		
    		label_1.setBounds(289, 0, 145, 184);
    		contentPane.add(label_1);
    		
    		JLabel label_2 = new JLabel("\u5982\u679C\u65E0\u6CD5\u8FDE\u63A5\u8BF7\u5C06\u672C\u673A\u9632\u706B\u5899\u5173\u95ED");
    		label_2.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		label_2.setBounds(10, 233, 236, 15);
    		contentPane.add(label_2);
    		new Thread(new fwq()).start();
    		//
    
    		new DropTarget(this,new DropTargetAdapter() {
    			
    			public void drop(DropTargetDropEvent arg0) {
    				发送.this.drop(arg0);
    //	            arg0.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);//接受滴 没这句就会报错
    //	            arg0.acceptDrop(3);//接受滴 没这句就会报错 3表示移动or复制
    //				List<?> list=null;
    //				try {
    //					list = (List<?>) arg0.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
    //										//get可转让的		get数据传输		数据的味道。java文件列表的味道
    //					File fi=(File)list.get(0);
    //					mulu=fi.getPath();
    //					textField.setText(mulu);
    //				} catch (UnsupportedFlavorException | IOException e) {
    //					e.printStackTrace();
    //				}
    			}
    
    		});
    		new DropTarget(textField,new DropTargetAdapter() {
    			
    			public void drop(DropTargetDropEvent arg0) {
    				发送.this.drop(arg0);
    			}
    		});
    	}
    	public static JLabel label_1 = new JLabel("");
    
    	public void paint(Graphics g) {
    		super.paint(g);
    //		int daxiao=12;
    //		int weizhi=4;
    //		int x=11;
    //		g.setFont(new Font("微软雅黑",0,daxiao));
    //		g.drawString("已连接:"+fwq.list.size(), x, daxiao*weizhi++);
    		g.drawString("已连接:"+fwq.list.size(),11,48);
    	}
    	public void drop(DropTargetDropEvent arg0){
    		arg0.acceptDrop(3);//接受滴 没这句就会报错 3表示移动or复制
    		List<?> list=null;
    		try {
    			list = (List<?>) arg0.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
    								//get可转让的		get数据传输		数据的味道。java文件列表的味道
    			File fi=(File)list.get(0);
    			mulu=fi.getPath();
    			textField.setText(mulu);
    		} catch (UnsupportedFlavorException | IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    class fwq implements Runnable{
    	public static ArrayList<Socket> list;
    	public static int yilianjie=0;
    
    	public void run() {
    		list=new ArrayList<Socket>();
    		ServerSocket soo=null;
    		Executor ex=Executors.newCachedThreadPool();
    		try {
    			soo=new ServerSocket(61855);
    		} catch (IOException e) {
    //			e.printStackTrace();
    //			javax.swing.JOptionPane.showMessageDialog(发送.发送, "端口61855已打开 启动程序失败 可能程序已经启动...");
    			try {
    				Message dialog = new Message(发送.发送, "<html>端口61855已打开 启动程序失败 可能程序已经启动..."
    						+ "<br>程序将在5秒内退出",380,129);
    				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    				dialog.setVisible(true);
    			} catch (Exception ee) {
    				ee.printStackTrace();
    			}
    			try {
    				Thread.sleep(5000);
    			} catch (InterruptedException e1) {
    				e1.printStackTrace();
    			}
    //			System.exit(1);
    		}
    		while(true){
    		try {
    			Socket so=soo.accept();//等待连接s
    			list.add(so);
    			yilianjie++;
    			发送.发送.repaint();
    			ex.execute(new dklj(so));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		}
    		
    		
    		
    	}
    	class dklj implements Runnable{
    		Socket so=null;
    		dklj(Socket so){
    			this.so=so;
    		}
    		public void run() {
    			BufferedReader in=null;
    			while(true){
    				try {
    					in=new BufferedReader(new InputStreamReader(so.getInputStream()));
    					if(in.readLine()==null){break;}
    				} catch (IOException e) {
    //					e.printStackTrace();
    //					System.out.println("一位用户已退出...");
    					break;
    				}
    				
    			}
    			fwq.yilianjie--;
    			list.remove(so);
    			发送.发送.repaint();
    			try {
    				if(in!=null)in.close();
    				if(so!=null)so.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			
    		}
    	}
    	
    }
    class fasong implements Runnable{
    	public static ArrayList<aaa> list=new ArrayList<aaa>();
    	Socket so=null;
    	private aaa aaa;
    	public fasong(Socket so){
    		this.so=so;
    		aaa=new aaa();
    		list.add(aaa);
    	}
    
    	public void run() {
    		File fi=new File(发送.mulu);
    		BufferedInputStream in=null;
    		try {
    			in=new BufferedInputStream(new FileInputStream(fi));
    			DataOutputStream out=new DataOutputStream(new BufferedOutputStream(so.getOutputStream()));
    			String name=fi.getName();
    			long size=fi.length();long yifasong=0;
    			int len;
    			byte[] by=new byte[1024*1024*10];
    			out.writeUTF(name);
    			out.flush();
    			out.writeLong(size);
    			out.flush();
    			
    			while((len=in.read(by))!=-1){
    				out.write(by,0,len);
    				out.flush();
    				yifasong+=len;
    //				System.out.println("已发送:"+yifasong*100.0/size+"%");
    				double bfb=yifasong*100.0/size;
    				bfb=(int)(bfb*10);
    				bfb/=10;
    				aaa.s="已发送:"+bfb+"%";
    //				发送.发送.repaint();
    			}
    			list.remove(aaa);
    //			发送.发送.repaint();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		try {
    			if(in!=null)in.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		发送.发送.repaint();
    		
    		
    	}
    	
    }
    class aaa{
    	public String s="已发送:0.0%";
    }
    class drawaaa implements Runnable{
    
    	public void run() {
    		while(fasong.list.size()>0){
    			try {
    				Thread.sleep(0);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			aaa aaa=null;
    			StringBuffer str=new StringBuffer("<html>");
    			for(int i=0;i<fasong.list.size();i++){
    				aaa=fasong.list.get(i);
    				str.append(aaa.s);
    				str.append("<br>");
    			}
    			发送.label_1.setText(str.toString());
    		}
    		发送.label_1.setText("已完成");
    		发送.发送.repaint();
    //		javax.swing.JOptionPane.showMessageDialog(发送.发送, "传输完成!");
    		try {
    			Message dialog = new Message(发送.发送, "传输完成!",278,129);
    			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    			dialog.setVisible(true);
    		} catch (Exception ee) {
    			ee.printStackTrace();
    		}
    	}
    	
    }

    接受.java

    package v1_3;
    
    import java.awt.Component;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.filechooser.FileSystemView;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.net.Socket;
    import java.awt.event.ActionEvent;
    import java.awt.Font;
    import java.awt.SystemColor;
    import java.awt.Color;
    
    public class 接受 extends JFrame {
    
    	private JPanel contentPane;
    	private JTextField textField;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					接受 frame = new 接受(null);
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	private void lujingout(){
    		BufferedWriter out=null;
    		try {
    			out=new BufferedWriter(new FileWriter("Set.txt"));
    			out.write(textField_1.getText()+"\r\n");
    		} catch (IOException e) {
    //			e.printStackTrace();
    		}
    		try {
    			if (out!=null) {
    				out.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	private void lujingin(){
    		BufferedReader in=null;
    		try {
    			in=new BufferedReader(new FileReader("Set.txt"));
    			String s=in.readLine();
    			textField_1.setText(s);
    		} catch (IOException e) {
    //			e.printStackTrace();
    		}
    		try {
    			if(in!=null){
    				in.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public static boolean yilianjie=false;
    	public static boolean jinzhiguanbi=false;
    	public 接受(Component toto) {
    		setResizable(false);
    		setTitle("\u5C40\u57DF\u7F51\u6587\u4EF6\u4F20\u8F93-\u63A5\u6536\u65B9V1.2");
    		FileSystemView fsv = FileSystemView.getFileSystemView();  //注意了,这里重要的一句
    //		System.out.println(fsv.getHomeDirectory());                //得到桌面路径
    		setDefaultCloseOperation(0);
    		this.addWindowListener(new WindowAdapter() {
    		public void windowClosing(WindowEvent arg0) {
    			super.windowClosing(arg0);
    			if(jinzhiguanbi){
    				javax.swing.JOptionPane.showMessageDialog(接受.this, "正在传输文件...");
    			}
    			else{
    				lujingout();
    				System.exit(0);
    			}
    		}
    		});
    		setBounds(100, 100, 450, 300);
    		setLocationRelativeTo(toto);
    		setLocation(this.getX()+this.getWidth()/2, this.getY());
    		contentPane = new JPanel();
    		contentPane.setBackground(Color.WHITE);
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		textField = new JTextField();
    		textField.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		textField.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				if (!yilianjie) {
    					new Thread(new lianjie(textField.getText())).start();
    				} else {
    //					javax.swing.JOptionPane.showMessageDialog(接受.this, "您已连接服务器 请不要重复点击...");
    					try {
    						Message dialog = new Message(接受.this, "已连接服务器...",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    				}
    			}
    		});
    		textField.setText("192.168.1.");
    		textField.setBounds(46, 139, 260, 21);
    		contentPane.add(textField);
    		textField.setColumns(10);
    		
    		JButton button = new JButton("\u8FDE\u63A5");
    		button.setBackground(Color.WHITE);
    		button.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				if(!yilianjie){
    				new Thread(new lianjie(textField.getText())).start();
    				}else{
    //					javax.swing.JOptionPane.showMessageDialog(接受.this, "您已连接服务器 请不要重复点击...");
    					try {
    						Message dialog = new Message(接受.this, "已连接服务器...",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    				}
    			}
    		});
    		button.setBounds(316, 138, 93, 23);
    		contentPane.add(button);
    		lblip.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		
    		lblip.setBounds(10, 114, 414, 15);
    		contentPane.add(lblip);
    		
    		textField_1 = new JTextField(fsv.getHomeDirectory().toString()+"\\");
    		textField_1.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		lujingin();
    		textField_1.setBounds(46, 195, 260, 21);
    		contentPane.add(textField_1);
    		textField_1.setColumns(10);
    		
    		label = new JLabel("\u53E6\u5B58\u4E3A\u76EE\u5F55\uFF1A");
    		label.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		label.setBounds(10, 170, 109, 15);
    		contentPane.add(label);
    		
    		button_1 = new JButton("\u6D4F\u89C8");
    		button_1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    //				javax.swing.JOptionPane.showMessageDialog(接受.this, "此按钮不可用,请将保存路径复制到编辑框");
    				try {
    					Message dialog = new Message(接受.this, "此按钮不可用 请将保存路径复制到编辑框",278,129);
    					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    					dialog.setVisible(true);
    				} catch (Exception ee) {
    					ee.printStackTrace();
    				}
    			}
    		});
    		button_1.setBackground(Color.WHITE);
    		button_1.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		button_1.setBounds(316, 194, 93, 23);
    		contentPane.add(button_1);
    		
    		lblNewLabel = new JLabel("");
    		lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		lblNewLabel.setBounds(142, 60, 144, 15);
    		contentPane.add(lblNewLabel);
    		
    		button_2 = new JButton("\u8BBE\u4E3A\u684C\u9762");
    		button_2.setBackground(Color.WHITE);
    		button_2.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		button_2.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				FileSystemView fsv = FileSystemView.getFileSystemView();  //注意了,这里重要的一句
    				textField_1.setText(fsv.getHomeDirectory()+"\\");
    			}
    		});
    		button_2.setBounds(213, 220, 93, 23);
    		contentPane.add(button_2);
    		
    		button_3 = new JButton("\u4F7F\u7528\u4E0A\u4E00\u6B21\u7684\u8DEF\u5F84");
    		button_3.setBackground(Color.WHITE);
    		button_3.setFont(new Font("微软雅黑", Font.PLAIN, 14));
    		button_3.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				lujingin();
    			}
    		});
    		button_3.setBounds(56, 220, 147, 23);
    		contentPane.add(button_3);
    		接受=this;
    	}
    	public static 接受 接受;
    	public static JLabel lblip = new JLabel("\u8BF7\u5148\u8FDE\u63A5\u5230\u5BF9\u65B9IP\uFF1A");
    	public static JTextField textField_1;
    	private JLabel label;
    	private JButton button_1;
    	public static JLabel lblNewLabel;
    	private JButton button_2;
    	private JButton button_3;
    
    }
    class lianjie implements Runnable{
    	public Socket so;
    	private String ip;
    	public lianjie(String s){
    		this.ip=s;
    	}
    
    	public void run() {
    		try {
    			接受.lblip.setText("正在连接"+ip+"...");
    			so=new Socket(ip,61855);
    			接受.lblip.setText("已连接"+ip+" 等待对方发送文件...");
    			接受.yilianjie=true;
    			new Thread(new shouwenjian()).start();
    		} catch (IOException e) {
    //			e.printStackTrace();
    			if(接受.yilianjie)
    				接受.lblip.setText("连接失败请检查IP是否正确");
    		}
    	}
    	class shouwenjian implements Runnable{
    
    		public void run() {
    			BufferedOutputStream out=null;
    			DataInputStream in=null;
    			try {
    				while (true) {
    					in = new DataInputStream(new BufferedInputStream(so.getInputStream()));
    					byte[] by = new byte[1024 * 1024 * 10];
    					String name = in.readUTF();
    					long size = in.readLong();
    					接受.jinzhiguanbi=true;
    					long jieshou = 0;
    					int len;
    					String s=接受.textField_1.getText();
    					char c=s.charAt(s.length()-1);
    					if(c!='\\'){
    						s+="\\";
    					}
    					//
    					File mulu=new File(s);
    					if (!mulu.getParentFile().exists()) {
    						mulu.getParentFile().mkdirs();
    					}
    					// 判断文件是否存在,不存在就创建文件
    					if (!mulu.exists() && !mulu.isDirectory()) {
    						mulu.mkdir();
    					}
    					//
    					File fi = new File(s + name);
    					out = new BufferedOutputStream(new FileOutputStream(fi));//可能会出错
    					while ((len = in.read(by)) != -1) {
    						out.write(by, 0, len);
    						out.flush();
    						jieshou += len;
    						double bfb=jieshou*100.0/size;
    						bfb=(int)(bfb*10);
    						bfb/=10;
    //						接受.lblNewLabel.setText("已接收:" + jieshou*100.0 / size  + "%");
    						接受.lblNewLabel.setText("已接收:" + bfb  + "%");
    //						接受.接受.repaint();
    						if (jieshou >= size) {
    							break;
    						}
    					}
    					out.close();
    //					javax.swing.JOptionPane.showMessageDialog(接受.接受, "文件接收完成...");
    					try {
    						Message dialog = new Message(接受.接受, "文件接收完成...",278,129);
    						dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    						dialog.setVisible(true);
    					} catch (Exception ee) {
    						ee.printStackTrace();
    					}
    					接受.jinzhiguanbi=false;
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    //				javax.swing.JOptionPane.showMessageDialog(接受.接受, "文件路径异常或发送方已关闭软件");
    				try {
    					Message dialog = new Message(接受.接受, "文件路径异常或发送方已关闭软件",278,129);
    					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    					dialog.setVisible(true);
    				} catch (Exception ee) {
    					ee.printStackTrace();
    				}
    			}
    			
    			///
    			接受.jinzhiguanbi=false;
    			接受.yilianjie=false;
    			接受.lblip.setText("已断开连接");
    			try {
    				if(out!=null)out.close();
    				if(in!=null)in.close();
    				if(so!=null)so.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			
    			
    		}
    		
    	}
    	
    }

    入口.java

    package v1_3;
    
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.awt.dnd.DropTarget;
    import java.awt.dnd.DropTargetAdapter;
    import java.awt.dnd.DropTargetDropEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import java.awt.event.ActionEvent;
    
    public class 入口 extends JFrame {
    
    	private JPanel contentPane;
    
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					入口 frame = new 入口();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				System.out.println("请不要关闭此窗口!!!");
    				System.out.println("请不要关闭此窗口!!!");
    				System.out.println("请不要关闭此窗口!!!");
    				System.out.print("重要是事情要说三遍");
    			}
    		});
    	}
    
    	public 入口() {
    		setResizable(false);
    		setTitle("\u5C40\u57DF\u7F51\u4F20\u8F93\u6587\u4EF6v1.2");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(450, 300);
    		setLocationRelativeTo(null);
    		contentPane = new JPanel();
    		contentPane.setBackground(Color.WHITE);
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
    		
    		JButton btnNewButton = new JButton("\u53D1\u6587\u4EF6");
    		btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				发送 f=new 发送(入口.this);
    				入口.this.setVisible(false);
    				f.setVisible(true);
    			}
    		});
    		btnNewButton.setBackground(Color.WHITE);
    		btnNewButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
    		btnNewButton.setBounds(10, 81, 414, 32);
    		contentPane.add(btnNewButton);
    		
    		JButton button = new JButton("\u6536\u6587\u4EF6");
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				接受 f=new 接受(入口.this);
    				入口.this.setVisible(false);
    				f.setVisible(true);
    			}
    		});
    		button.setBackground(Color.WHITE);
    		button.setFont(new Font("微软雅黑", Font.PLAIN, 16));
    		button.setBounds(10, 123, 414, 32);
    		contentPane.add(button);
    		
    		JButton button_1 = new JButton("\u5173\u4E8E");
    		button_1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    //				javax.swing.JOptionPane.showMessageDialog(入口.this,"BY:李子果");
    				try {
    					Message dialog = new Message(入口.this,"<html>BY:李子果",278,129);
    					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    					dialog.setVisible(true);
    				} catch (Exception ee) {
    					ee.printStackTrace();
    				}
    			}
    		});
    		button_1.setBackground(Color.WHITE);
    		button_1.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		button_1.setBounds(331, 228, 93, 23);
    		contentPane.add(button_1);
    		
    		JButton btnNewButton_1 = new JButton("\u7248\u672C\u8BF4\u660E");
    		btnNewButton_1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    //				javax.swing.JOptionPane.showMessageDialog(入口.this, "版本v1.2-新增拖拽文件上传 接发文件合并-兼容v1.1\n"
    //						+ "版本v1.1-修复大部分bug 新外观 支持多次传输\n"
    //						+ "版本v1.0-无介绍");
    //				new Message(入口.this,"<html>版本v1.2-新增拖拽文件上传 接发文件合并-兼容v1.1<br>"
    //						+ "版本v1.1-修复大部分bug 新外观 支持多次传输<br>"
    //						+ "版本v1.0-无介绍",374,158);
    				
    				try {
    					Message dialog = new Message(入口.this,"<html>版本v1.3-优化外观-兼容v1.2 v1.1<br>"
    							+ "版本v1.2-新增拖拽文件上传 接发文件合并-兼容v1.1<br>"
    							+ "版本v1.1-修复大部分bug 新外观 支持多次传输<br>"
    							+ "版本v1.0-无介绍",374,158);
    					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    					dialog.setVisible(true);
    				} catch (Exception ee) {
    					ee.printStackTrace();
    				}
    			}
    		});
    		btnNewButton_1.setBackground(Color.WHITE);
    		btnNewButton_1.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		btnNewButton_1.setBounds(10, 228, 93, 23);
    		contentPane.add(btnNewButton_1);
    //		new DropTarget(this,new DropTargetAdapter() {
    //			
    //			public void drop(DropTargetDropEvent arg0) {
    //				arg0.acceptDrop(3);
    //				try {
    //					List<?> list=(List<?>) arg0.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
    //					File fi=(File)list.get(0);
    //					System.out.println(fi.getPath());
    //				} catch (UnsupportedFlavorException | IOException e) {
    //					// TODO 自动生成的 catch 块
    //					e.printStackTrace();
    //				}
    //			}
    //		});
    	}
    
    }
    

    Message.java

    package v1_3;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.JLabel;
    import java.awt.Font;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.Color;
    import java.awt.Component;
    
    import javax.swing.SwingConstants;
    
    public class Message extends JDialog {
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		try {
    			Message dialog = new Message(null,"<html>123<br>123",450,300);
    			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    			System.out.println(JDialog.DISPOSE_ON_CLOSE);
    			dialog.setVisible(true);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * Create the dialog.
    	 */
    	public Message(Component a,String s,int w,int h) {
    		setTitle("\u6D88\u606F");
    		setResizable(false);
    		getContentPane().setBackground(Color.WHITE);
    //		setBounds(100, 100, 450, 300);
    		setSize(w, h);
    		setLocationRelativeTo(a);
    		getContentPane().setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel(s);
    		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    		lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    //		lblNewLabel.setBounds(10, 10, 414, 208);
    		lblNewLabel.setBounds(10, 10, this.getWidth()-36, this.getHeight()-92);
    		getContentPane().add(lblNewLabel);
    		
    		JButton btnNewButton = new JButton("\u786E\u5B9A");
    		btnNewButton.setBackground(Color.WHITE);
    		btnNewButton.setFont(new Font("微软雅黑", Font.PLAIN, 12));
    		btnNewButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				Message.this.dispose();
    			}
    		});
    		btnNewButton.setBounds(331, 228, 93, 23);
    		getContentPane().add(btnNewButton);
    		btnNewButton.setLocation(this.getWidth()-btnNewButton.getWidth()-26, this.getHeight()-btnNewButton.getHeight()-49);
    	}
    }

    下载地址:https://download.csdn.net/download/u010756046/10482469


    展开全文
  • C#网络传输文件(socket)

    千次下载 热门讨论 2008-03-27 15:47:53
    CLIENT、SERVER模式文件传输。一定可以。源码,Vs2003
  • 基于socket文件传输

    2017-08-18 07:11:35
    用MFC做的一个小的聊天工具,要实现一个文件传输的功能,但是用ios::binary打开文件后有些文件发送不了,只能够发送txt文本,不知道为什么会这样 debug的时候发现用来将要发送的文件内容读取的缓冲区里的内容是 无效...
  • Java基于Socket文件传输示例

    千次阅读 2014-03-22 14:05:39
    需要进行网络传输大文件,于是对基于socket文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度...
    需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度。废话少说,先来看服务器端的程序。

    1.服务器端

    import  java.io.BufferedInputStream;
    import  java.io.DataInputStream;
    import  java.io.DataOutputStream;
    import  java.io.File;
    import  java.io.FileInputStream;
    import  java.net.ServerSocket;
    import  java.net.Socket;
    
    public   class  ServerTest  {
         int  port  =   8821 ;
    
         void  start()  {
            Socket s  =   null ;
             try   {
                ServerSocket ss  =   new  ServerSocket(port);
                 while  ( true )  {
                     //  选择进行传输的文件
                    String filePath  =   " D://lib.rar " ;
                    File fi  =   new  File(filePath);
    
                    System.out.println( " 文件长度: "   +  ( int ) fi.length());
    
                     //  public Socket accept() throws
                     //  IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
    
                    s  =  ss.accept();
                    System.out.println( " 建立socket链接 " );
                    DataInputStream dis  =   new  DataInputStream( new  BufferedInputStream(s.getInputStream()));
                    dis.readByte();
    
                    DataInputStream fis  =   new  DataInputStream( new  BufferedInputStream( new  FileInputStream(filePath)));
                    DataOutputStream ps  =   new  DataOutputStream(s.getOutputStream());
                     // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
                    ps.writeUTF(fi.getName());
                    ps.flush();
                    ps.writeLong(( long ) fi.length());
                    ps.flush();
    
                     int  bufferSize  =   8192 ;
                     byte [] buf  =   new   byte [bufferSize];
    
                     while  ( true )  {
                         int  read  =   0 ;
                         if  (fis  !=   null )  {
                            read  =  fis.read(buf);
                        }
    
                         if  (read  ==   - 1 )  {
                             break ;
                        }
                        ps.write(buf,  0 , read);
                    }
                    ps.flush();
                     //  注意关闭socket链接哦,不然客户端会等待server的数据过来,
                     //  直到socket超时,导致数据不完整。                
                    fis.close();
                    s.close();                
                    System.out.println( " 文件传输完成 " );
                }
    
            }   catch  (Exception e)  {
                e.printStackTrace();
            }
        }
    
         public   static   void  main(String arg[])  {
             new  ServerTest().start();
        }
    }

    2.socket的Util辅助类

     import  java.net. * ;
    import  java.io. * ;
    
    public   class  ClientSocket  {
         private  String ip;
    
         private   int  port;
    
         private  Socket socket  =   null ;
    
        DataOutputStream out  =   null ;
    
        DataInputStream getMessageStream  =   null ;
    
         public  ClientSocket(String ip,  int  port)  {
             this .ip  =  ip;
             this .port  =  port;
        }
    
         /**
         * 创建socket连接
         * 
         *  @throws  Exception
         *             exception
          */
         public   void  CreateConnection()  throws  Exception  {
             try   {
                socket  =   new  Socket(ip, port);
            }   catch  (Exception e)  {
                e.printStackTrace();
                 if  (socket  !=   null )
                    socket.close();
                 throw  e;
            }   finally   {
            }
        }
    
         public   void  sendMessage(String sendMessage)  throws  Exception  {
             try   {
                out  =   new  DataOutputStream(socket.getOutputStream());
                 if  (sendMessage.equals( " Windows " ))  {
                    out.writeByte( 0x1 );
                    out.flush();
                     return ;
                }
                 if  (sendMessage.equals( " Unix " ))  {
                    out.writeByte( 0x2 );
                    out.flush();
                     return ;
                }
                 if  (sendMessage.equals( " Linux " ))  {
                    out.writeByte( 0x3 );
                    out.flush();
                }   else   {
                    out.writeUTF(sendMessage);
                    out.flush();
                }
            }   catch  (Exception e)  {
                e.printStackTrace();
                 if  (out  !=   null )
                    out.close();
                 throw  e;
            }   finally   {
            }
        }
    
         public  DataInputStream getMessageStream()  throws  Exception  {
             try   {
                getMessageStream  =   new  DataInputStream( new  BufferedInputStream(socket.getInputStream()));
                 return  getMessageStream;
            }   catch  (Exception e)  {
                e.printStackTrace();
                 if  (getMessageStream  !=   null )
                    getMessageStream.close();
                 throw  e;
            }   finally   {
            }
        }
    
         public   void  shutDownConnection()  {
             try   {
                 if  (out  !=   null )
                    out.close();
                 if  (getMessageStream  !=   null )
                    getMessageStream.close();
                 if  (socket  !=   null )
                    socket.close();
            }   catch  (Exception e)  {
    
            }
        }
    }

    3.客户端

     import  java.io.BufferedOutputStream;
    import  java.io.DataInputStream;
    import  java.io.DataOutputStream;
    import  java.io.FileOutputStream;
    
    public   class  ClientTest  {
         private  ClientSocket cs  =   null ;
    
         private  String ip  =   " localhost " ; //  设置成服务器IP
    
         private   int  port  =   8821 ;
    
         private  String sendMessage  =   " Windwos " ;
    
         public  ClientTest()  {
             try   {
                 if  (createConnection())  {
                    sendMessage();
                    getMessage();
                }
    
            }   catch  (Exception ex)  {
                ex.printStackTrace();
            }
        }
    
         private   boolean  createConnection()  {
            cs  =   new  ClientSocket(ip, port);
             try   {
                cs.CreateConnection();
                System.out.print( " 连接服务器成功! "   +   " /n " );
                 return   true ;
            }   catch  (Exception e)  {
                System.out.print( " 连接服务器失败! "   +   " /n " );
                 return   false ;
            }
    
        }
    
         private   void  sendMessage()  {
             if  (cs  ==   null )
                 return ;
             try   {
                cs.sendMessage(sendMessage);
            }   catch  (Exception e)  {
                System.out.print( " 发送消息失败! "   +   " /n " );
            }
        }
    
         private   void  getMessage()  {
             if  (cs  ==   null )
                 return ;
            DataInputStream inputStream  =   null ;
             try   {
                inputStream  =  cs.getMessageStream();
            }   catch  (Exception e)  {
                System.out.print( " 接收消息缓存错误/n " );
                 return ;
            }
    
             try   {
                 // 本地保存路径,文件名会自动从服务器端继承而来。
                String savePath  =   " E:// " ;
                 int  bufferSize  =   8192 ;
                 byte [] buf  =   new   byte [bufferSize];
                 int  passedlen  =   0 ;
                 long  len = 0 ;
                
                savePath  +=  inputStream.readUTF();
                DataOutputStream fileOut  =   new  DataOutputStream( new  BufferedOutputStream( new  BufferedOutputStream( new  FileOutputStream(savePath))));
                len  =  inputStream.readLong();
                
                System.out.println( " 文件的长度为: "   +  len  +   " /n " );
                System.out.println( " 开始接收文件! "   +   " /n " );
                        
                 while  ( true )  {
                     int  read  =   0 ;
                     if  (inputStream  !=   null )  {
                        read  =  inputStream.read(buf);
                    }
                    passedlen  +=  read;
                     if  (read  ==   - 1 )  {
                         break ;
                    }
                     // 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
                    System.out.println( " 文件接收了 "   +   (passedlen  *   100 /  len)  +   " %/n " );
                    fileOut.write(buf,  0 , read);
                }
                System.out.println( " 接收完成,文件存为 "   +  savePath  +   " /n " );
    
                fileOut.close();
            }   catch  (Exception e)  {
                System.out.println( " 接收消息错误 "   +   " /n " );
                 return ;
            }
        }
    
         public   static   void  main(String arg[])  {
             new  ClientTest();
        }
    } 

    这就实现了从服务器端向客户端发送文件的过程,当然,反过来,也一样.稍有不同.代码中对跨平台的细节没有实现,


    转自【http://www.open-open.com/lib/view/open1390525710507.html】

    展开全文
  • Socket实现文件传输

    万次阅读 2018-07-25 17:46:03
    Socket实现文件传输 1.客户端 通过new Socket("ip",port)连接服务端 创建文件输入流读取文件 创建返回套接字的输出流 写入文章名称,长度等属性 读取、写入文章操作 关闭流 package com.company;...

    Socket实现文件传输

    1.客户端

    通过new Socket("ip",port)连接服务端

    创建文件输入流读取文件

    创建返回套接字的输出流

    写入文章名称,长度等属性

    读取、写入文章操作

    关闭流

    package com.company;
    
    import javax.xml.crypto.Data;
    import java.io.*;
    import java.net.Socket;
    
    //客户端
    public class Client extends Socket{
    	private  final String SERVER_IP="192.168.201.104";
    	private final int SERVER_PORT=8999;
    	private Socket client;
    	private FileInputStream fis;
    	private DataOutputStream dos;
    
    	//创建客户端,并指定接收的服务端IP和端口号
    	public Client() throws IOException{
    		this.client=new Socket(SERVER_IP,SERVER_PORT);
    		System.out.println("成功连接服务端..."+SERVER_IP);
    	}
    
    	//向服务端传输文件
    	public void sendFile(String url) throws IOException {
    		File file=new File(url);
    		try {
    			 fis = new FileInputStream(file);
    			//BufferedInputStream bi=new BufferedInputStream(new InputStreamReader(new FileInputStream(file),"GBK"));
    			dos = new DataOutputStream(client.getOutputStream());//client.getOutputStream()返回此套接字的输出流
    			//文件名、大小等属性
    			dos.writeUTF(file.getName());
    			dos.flush();
    			dos.writeLong(file.length());
    			dos.flush();
    			// 开始传输文件
    			System.out.println("======== 开始传输文件 ========");
    			byte[] bytes = new byte[1024];
    			int length = 0;
    			
    			while ((length = fis.read(bytes, 0, bytes.length)) != -1) {
    				dos.write(bytes, 0, length);
    				dos.flush();
    			}
    			System.out.println("======== 文件传输成功 ========");
    		}catch(IOException e){
    			e.printStackTrace();
    			System.out.println("客户端文件传输异常");
    		}finally{
    			fis.close();
    			dos.close();
    		}
    	}
    	public static void main(String[] args) {
    		try {
    			Client client = new Client(); // 启动客户端连接
    			client.sendFile("E:/dxn/aaa.txt"); // 传输文件
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    

    2服务端

    启动服务端new ServerSocket(port)

    接收连接服务端的客户端对象

    创建返回套接字的输入流

    创建文件输出流写出文件

    读取文章名称,长度等属性

    读取、写入文章操作

    关闭流

    package com.company;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class FileServer extends ServerSocket{
    
            private static final int SERVER_PORT = 8999; // 服务端端口
            private ServerSocket server;
            private Socket socket;
            private DataInputStream dis;
            private FileOutputStream fos;
    
            public FileServer() throws Exception {
                server=new ServerSocket(SERVER_PORT);
            }
    
            public void task() throws IOException{
                System.out.println("======== 等待连接 ========");
                Socket socket = server.accept();
                System.out.println(" Ip:"+socket.getInetAddress()+"已连接");
                try {
                    dis = new DataInputStream(socket.getInputStream());
                    // 文件名和长度
                    String fileName = dis.readUTF();
                    long fileLength = dis.readLong();
                    File directory = new File("E:/a");
                    if(!directory.exists()) {
                        directory.mkdir();
                    }
                    File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
    
                    fos = new FileOutputStream(file);
                    System.out.println("file。。。。。。。。。。。。。。"+file);
                    System.out.println("fileName。。。。。。。。。。。。。。"+fileName);
    
                    System.out.println("======== 开始接收文件 ========");
                    byte[] bytes = new byte[1024];
                    int length = 0;
                    while((length = dis.read(bytes, 0, bytes.length)) != -1) {
                        fos.write(bytes, 0, length);
                        fos.flush();
                    }
    
                    System.out.println("======== 文件接收成功 ========");
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if(fos != null)
                                fos.close();
                            if(dis != null)
                                dis.close();
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
            public static void main(String[] args) {
                try {
                    FileServer server = new FileServer(); // 启动服务端
                    server.task();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    

    3. 每接收到一个Socket就建立一个新的线程来处理它

    package com.company;
    
    
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server extends ServerSocket {
    
    	private static final int SERVER_PORT = 8999; // 服务端端口
    
    	private ServerSocket server;
    
    	public Server() throws Exception {
    		server=new ServerSocket(SERVER_PORT);
    	}
    
    	/**
    	 * 使用线程处理每个客户端传输的文件
    	 * @throws Exception
    	 */
    	public void load() throws Exception {
    		while (true) {
    			System.out.println("-----------等待连接-------- ");
    			Socket socket = server.accept();//接收连接服务端的客户端对象
    			System.out.println("ip" + socket.getInetAddress() + "已连接");
    			new Thread(new Transfer(socket),"thread1").start();// 每接收到一个Socket就建立一个新的线程来处理它
    			System.out.println(Thread.currentThread().getName());
    		}
    	}
    
    	/**
    	 * 处理客户端传输过来的文件线程类
    	 */
    	class Transfer implements Runnable {
    
    		private Socket socket;
    		private DataInputStream dis;
    		private FileOutputStream fos;
    
    		public Transfer(Socket socket) {
    			this.socket = socket;
    		}
    
    		@Override
    		public void run() {
    			try {
    				dis = new DataInputStream(socket.getInputStream());
    
    				// 文件名和长度
    				String fileName = dis.readUTF();
    				long fileLength = dis.readLong();
    				File directory = new File("E:/xn");
    				if(!directory.exists()) {
    					directory.mkdir();
    				}
    				File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
    				System.out.println("file"+file);
    				fos = new FileOutputStream(file);
    
    				// 开始接收文件
    				byte[] bytes = new byte[1024];
    				int length = 0;
    				while((length = dis.read(bytes, 0, bytes.length)) != -1) {
    					fos.write(bytes, 0, length);
    					fos.flush();
    				}
    				System.out.println("======== 文件接收成功 [File Name:" + fileName + "] ");
    			} catch (Exception e) {
    				e.printStackTrace();
    			} finally {
    				try {
    					if(fos != null)
    						fos.close();
    					if(dis != null)
    						dis.close();
    
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	public static void main(String[] args) {
    		try {
    			Server server = new Server(); // 启动服务端
    			server.load();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    
    

     4.DataInputStream:数据输入流     读取基本 Java 数据类型

    DataOutputStream:数据输出流      写出基本 Java 数据类型

     

     

    展开全文
  • Python编程:socket实现文件传输

    千次阅读 2018-01-18 23:47:11
    思路: 读取文件名 检测文件是否存在 打开文件 检测文件大小 发送文件大小和MD5值给客户端 ...import hashlibserver = socket.socket()server.bind(("localhost", 6969)) # 绑定监听端口server.listen(5) # 监听pr
  • java Socket 文件传输

    万次阅读 多人点赞 2013-10-28 13:57:21
    客户端: import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException;...import java.net.InetSocketAddress;... * 文件发送客户端主程序
  • C# Socket 文件传输

    万次阅读 2011-08-31 18:48:24
    如果需要接收多个文件的时候,不能重复调用Socket.Bind(ipep),这样会出现socket异常的,因为socket已经监听了一个端口了,端口不能被重复使用。 完整代码: 发送端。。client private void b
  • Linux socket文件传输

    千次阅读 2015-05-29 17:31:35
    参考资料 [1]套接字传输文件的试验
  • socket 传输文件

    万次阅读 2009-08-30 00:14:00
    在两台计算机传输文件之前,必需得先有一台计算机建立套节子连接并绑定一个固定得端口,并在这个端口侦听另外一台计算机的连接请求。socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ...
  • socket实现大型文件传输

    万次阅读 多人点赞 2011-12-18 17:03:10
    最近需要做网络传输的项目,需要实现较大文件传输。在网上收集了不少资料,但是各有各的做法,尤其是关于文件自动接收这一块不太清楚。 经过图书馆查阅后还是找到了一种解决办法,虽然做的不太专业,但是思路比较...
  • 要实现的是开多线程传输一个文件,目的是提高传输速度。 思路是这样的:服务端开多线程,将文件分割,一个线程传输一块,客户端也开多线程,每个线程接受一块,最后拼成一个完整的文件。服务端支持多线程, 客户端要...
  • 用.net中的socket实现文件传输

    千次阅读 2007-03-21 22:56:00
    socket是网络套接字,使用它我们可以很方便的实现网络的数据传输。在.net中提供了socket类来帮助开发者调用socket的使用,从而... 编程思路:在这个简单的例子中我们将通过socket来实现文件的网络传输和接收功能。要实
  • #region 根据客户端传输文件名发送指定文件 public void SendFileFuncssss(object obj) { Socket socket = obj as Socket; while (true) { Socket socketServices = socket.Accept(); byte[] buffer ...
  • 我写了一个录制视频的app然后把录制的视频传送到pc端,但是传输到pc端的视频文件变大,而且无法播放,传输方式是DataOutputStream,具体代码如下; package com.example.lenovo.viedoapp; import android.app....
  • socket实现文件传输功能

    万次阅读 2017-06-03 21:12:11
    要实现的功能为:client 从 server 下载一个文件并保存到本地。 编写这个程序需要注意两个问题: 1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会...
  • Java实现socket文件传输

    千次阅读 2018-05-07 22:02:12
    Java实现通过socket文件传输:用到的类:DataInputStream :数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 ...
  • Socket编程一实现简易的聊天功能以及文件传输

    万次阅读 多人点赞 2017-02-21 21:26:11
    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看。我从小就喜爱看武侠小说,一直有着武侠梦。从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的...
  • java实现socket文件传输

    千次阅读 2013-10-23 10:05:28
    对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个...
  • socket网络编程,目前是同时开启两个进程两个线程,同时从server那端传输两个文件过来,是可以实现,任意格式的文件和任何大小的文件都可以。现在的项目要求是这两个进程要同时传输一个文件。我的思路是一个进程传输...
  • Socket文件传输过程详解

    千次阅读 2012-08-15 00:23:14
    今天写了一个文件传输工具。但是之前没有写过。就从网上学习了一下。掌握了大致的步骤。  第一阶段:Socket连接 服务器端(发送文件):首先打开文件【fopen】,用rb方式打开,既可以发送文本文件,也可以...
  • socket简单文件传输实例

    千次阅读 2016-12-07 23:27:32
    今天在linux系统上写了一个简单的socket文件传输的例子,共享出来仅供参考。例子很简单,只要初学者了解简单的几个socket相关函数和文件函数就能写的出来。 服务器端程序: #include #include #...
  • Java Socket实战之七 使用Socket通信传输文件

    万次阅读 多人点赞 2012-03-05 08:18:38
    本文地址:http://blog.csdn.net/kongxx/article/details/7319410Java Socket实战之一 单线程通信Java Socket实战之二 多线程通信Java Socket实战之三 传输对象Java Socket实战之四 传输压缩对象Java Socket实战之五...
  • Socket编程 ——文件传输

    千次阅读 2016-11-30 00:10:12
    1 利用流式套接字实现文件传输 内容: 客户端向服务端发起socket连接,并建立数据传输通道; 2 客户端向服务端发送要传输的文件名称,以‘#’字符结尾,服务端逐字符接收,直到接收到#; 3 (变长数据)客户端...
  • C 语言实现文件传输socket实现)

    千次阅读 2012-08-29 11:50:35
    本来想实现一个简单的可以从服务器下载文件,但是需要访问IP地址,比较麻烦,然后就先实现了文件传输,接下来慢慢实现从服务器下载文件…… 在这里需要提醒一下,复制的文件要放在服务器目录下,文件将复制到...

空空如也

1 2 3 4 5 ... 20
收藏数 83,261
精华内容 33,304
关键字:

文件传输