【Java小项目】一个Socket连续传输多个文件

Little_things 专栏收录该内容
17 篇文章 0 订阅

      想给前短时间做的那个山寨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();
        }

    }
}




  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值