java使用socket上传文件,实现server端和client端

今天接到任务需要定时扫描一个目录上传新加入的xml文件到指定的文件目录下,server端保持一直扫,client端在需要处理时接收文件。

server端

package transmission;

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.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class server {
	
	Timer timer;
	private static int port = 8838;
	private  ServerSocket ss=null;
	
	//String[] allFile;
	//List<String> allFile = new ArrayList<String>();
	public server(int seconds){
		try{
			 ss = new ServerSocket(port);
			 System.out.println("Socket is Listening at port:"+port);
			}catch(IOException ioe){
				ioe.printStackTrace();
				return;
			}
		timer = new Timer();
		//timer.schedule(newTimerTaskAction, seconds*1000);
		timer.schedule(new RemindTask(),0, seconds*1000);

	}
	
	class RemindTask extends TimerTask {
		List<String> allFile = new ArrayList<String>();
		public void run(){
			
			
			//List<String> allFile = new ArrayList<String>();
			String[] fileName = getFileNames("C:\\test1");
			
			int count = 0;
			List<String> newGuests = new ArrayList<String>(); 
			if(fileName !=null){
				if(allFile == null){
					for(int i=0;i<fileName.length;i++){
						allFile.add(fileName[i]);
					}
				}else{
					for(int i=0;i<fileName.length;i++){
						if(allFile.contains(fileName[i])){
							continue;
						}else{
							allFile.add(fileName[i]);
							String str = fileName[i];
							String newStr = str.substring(str.length()-3);
							if(newStr.equals("xml")){
								newGuests.add(fileName[i]);
							}
						}
					}
				}
			}
			System.out.println("------------------------");
			System.out.println("new files count = " + newGuests.size());
			String[] filePath = new String[newGuests.size()];
			for(int i=0;i<newGuests.size();i++){
				System.out.println(newGuests.get(i));
				filePath[i] = "C:\\test1\\" + newGuests.get(i);
			}
			for(String f:filePath){
				transportFile(f);
			}
		}
	}
	
	public void transportFile(String filePath){
		Socket s = null;
        try {
            /*ServerSocket ss = new ServerSocket(port);
            ss.setReuseAddress(true);
            ss.bind(new InetSocketAddress(port));*/
           
//            InetSocketAddress address = new InetSocketAddress(port);
//            ss.bind(address);
        	
//            while (true) {
                // 选择进行传输的文件
                File fi = new File(filePath);

                System.out.println("文件长度:" + (int) fi.length());

                // public Socket accept() throws
                // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

                try{
                	s = ss.accept();
                } catch(Exception e){
                	try{
                		ss.close();
                		return;
                	} catch (IOException el){
                		el.printStackTrace();
                	}
                }
                System.out.println("建立socket链接");
                try{
                	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();
                    fis.close();
                    ps.close();
//                    ss.close();
                } catch(Exception e){
//                	continue;
                	e.printStackTrace();
                }
                // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
                // 直到socket超时,导致数据不完整。
                
                // s.close();  
                //ss.close();
                System.out.println("文件"+filePath+"传输完成");
//            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
        try{
        	s.close();
        }catch(Exception e){
        	e.printStackTrace();
        }
        
	}
	
	public static String[] getFileNames(String path){
		File file = new File(path);
		String[] fileName = file.list();
		return fileName;
	}
	

	public static void main(String args[]){
		new server(5);
	}
	
}
实现定时扫描目录上传,client端有参考。
package transmission;


import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class client {
    private ClientSocket cs = null;

    private String ip = "localhost";// 设置成服务器IP

    private int port = 8838;

    private String sendMessage = "Windwos";

    public client() {
        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 = "C:\\test2\\";
            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 client();
    }
}
中间的ClientServer组件是上网download的,个人觉得可以自己修改。
package transmission;


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) {

        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值