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

原创 2015年11月17日 18:25:33

      想给前短时间做的那个山寨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 的 Socket 服务器和客户端通信的例子

一个 HelloWord 级别的 Java Socket 通信的例子。通讯过程:         先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求。然后运行 Client 端...
  • defonds
  • defonds
  • 2012年09月12日 15:21
  • 130824

java,利用一个socket发送多个文件

关键是发送端每write一次就要flush一次,否则容易出错。

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用Java的Socket套接字实现echo和大文件传输

初学Java的socket,简单地实现了echo功能,用socket实现局域网内部大文件的快速传输,鉴于socket的简单性,没有用nio。服务器和客户端连接成功后,echo功能将服务器接收到的数据行...

java socket 多线程网络传输多个文件

由于需要研究了下用 java socket 传输文件,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一个 socket 连接,每个 socket 连接负责传输一个文件,服务端的Ser...

通过Socket连接一次传输多个文件

最近在做一个通过WIFI在手机之间传输文件的功能。需要在手机之间建立一个持久的Socket连接并利用该连接传输数据。可以一次传输一个或多个文件。 在一次传输多个文件时,遇到了一个困难:如何在接收文件...
  • fx1ts
  • fx1ts
  • 2014年08月20日 10:33
  • 1852

Java socket长连接代码实现

服务器端程序: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolea...

java socket 多线程网络传输多个文件

由于需要研究了下用 java socket 传输文件,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一个 socket 连接,每个 socket 连接负责传输一个文件,服务端的Ser...

Java socket 多线程网络传输多个文件

http://software.intel.com/zh-cn/blogs/2013/05/20/java-socket ,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java小项目】一个Socket连续传输多个文件
举报原因:
原因补充:

(最多只允许输入30个字)