zoukankan      html  css  js  c++  java
  • 【Java小项目】一个Socket连续传输多个文件

          想给前短时间做的那个山寨QQ加一个传输文件的功能,因为那个山寨QQ每个客户端和服务器端就一个Socket连接用ObjectOutputStream进行通信,现在要加一个DataOutputStream来传输文件,所以先了写这个试验下。


         思路:

                 1.在发送DataOutputStream字节流前先发一个Object来通知接受端。

                 2.用writeLong通知接收端该文件的长度。

                 3.用writeUTF发送文件名称

                 4.接受端用接受到的文件长度来跳出读文件的循环

                 5.(缺点)接收文件的时候不能在接收Object信息

    代码如下

          Server

    package com.server;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Created by ztc on 15-11-16.
     */
    public class MyServer extends JFrame implements ActionListener{
        ServerSocket ss=null;
        Socket s=null;
    
        JFileChooser jfc;
        JButton jb,jb1;
        JTextArea jta;
        ObjectOutputStream oos;
        public static void main(String[] args){
            MyServer ms=new MyServer(8888);
            //ms.SendFile();
        }
        public MyServer(int port) {
            jfc=new JFileChooser();
            jb=new JButton("传输文件");
            jb.addActionListener(this);
            jb1=new JButton("SendObject!");
            jb1.addActionListener(this);
            jta=new JTextArea();
            jta.setEditable(false);
            jta.setAutoscrolls(true);
            this.add(jta,"Center");
            this.add(jb,"South");
            this.add(jb1,"North");
    
            this.setVisible(true);
            this.setLocation(500,300);
            this.setSize(300,200);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            try {
                ss=new ServerSocket(port);
                System.out.println("Server is running...on"+port);
                s=ss.accept();
                oos=new ObjectOutputStream(s.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        public void SendFile(File f,Object o){
            try {
                oos.writeObject(o);
                oos.flush();
    
                DataInputStream dis=new DataInputStream(new FileInputStream(f));
                DataOutputStream dos=new DataOutputStream(s.getOutputStream());
                //ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
                //oos.writeObject(f);
                dos.writeLong(f.length());
                dos.writeUTF(f.getName());
                System.out.println("长度:"+f.length());
                int count=-1,sum=0;
                byte[] buffer=new byte[1024*1024];
                while((count=dis.read(buffer))!=-1){
                    dos.write(buffer,0,count);
                    sum+=count;
                    System.out.println("以传输"+sum+"byte");
                }
                System.out.println("发送完毕!");
                dos.flush();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void SendObject(Object o){
            try {
                oos.writeObject(o);
                oos.flush();
                System.out.println("Sended Object!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==jb){
                jfc.setCurrentDirectory(jfc.getCurrentDirectory());
                int result=jfc.showOpenDialog(this);
                File f=jfc.getSelectedFile();
                if(result==0&&f!=null){
                    SendFile(f,"File");
                }
            }else if(e.getSource()==jb1){
                SendObject("hello Im Server!");
            }
        }
    }
    

    Client

    package com.client;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by ztc on 15-11-16.
     */
    public class MyClient{
        static Socket s = null;
        public static void main(String[] args) {
            MyClient my=new MyClient("127.0.0.1", 8888);
        }
    
        public MyClient(String host, int port) {
    
            try {
                s=new Socket(host,port);
                System.out.println("Data running>>>");
                ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
                while (true) {
                    String type=(String)ois.readObject();
                    System.out.println(type);
                    if(type.equals("File")){
                        new FileTransport(s).run();
                    }
                    System.out.println("Object接受完毕!");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    

    工具类

    package com.client;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by ztc on 15-11-17.
     */
    public class FileTransport {
        Socket s;
        public FileTransport(Socket s){
            this.s=s;
        }
        public void run(){
            try {
                System.out.println("Thread running>>>");
                DataInputStream dis = new DataInputStream(s.getInputStream());
                long length=dis.readLong();
                String name=dis.readUTF();
                DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File(name)));
                int count=-1,sum=0;
                byte[] buffer=new byte[1024*1024];
                while((count=dis.read(buffer))!=-1){
                    dos.write(buffer,0,count);
                    sum+=count;
                    System.out.println("已结收" + sum + "比特");
                    if(sum==length)
                        break;
                }
                dos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    




  • 相关阅读:
    【转】互联网科技大佬奋斗励志故事
    Java RestTemplate 请求参数字符串中有大括号{}的请求正确方法
    【资料最全】在100以内的所有情况,可以被写作三个数的立方和
    一个例子让你懂java里面的守护线程
    java中finally里面的代码一定会执行吗?(try里面做了return呢?)
    什么是mysql索引下推(有些装B面试官会问)
    java中静态变量指向的对象是在jvm那个区域?用图解告诉你。
    偶然发现在java方法中可以定义类
    Java里面的Comparable接口
    leetcode面试题 17.14. 最小K个数(快速排序,只排序一边)
  • 原文地址:https://www.cnblogs.com/A-yes/p/9894222.html
Copyright © 2011-2022 走看看