`
roomy
  • 浏览: 52731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用JAVA SOCKET发送和接收文件

    博客分类:
  • J2SE
阅读更多
/*服务器端接收文件*/
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFileChooser;

/**
* 该类用到的绑定端口初始为10000,如果绑定不成功则试另外的端口;
* 绑定次数用tryBindTimes变量,表示如果绑定失败会对它加一;
* 当前绑定端口由DefaultBindPort+tryBindTimes决定;
* 外界系统(调用此程序的对象)可以获取当前的帮定端口;
* 并告诉客户端服务的端口号以使其能正确连接到该端口上;
* @author
*
*/
public class GetFile extends Thread {

    // 服务套接字等待对方的连接和文件发送
    ServerSocket serSocket;
    // 由服务套接字产生的 套接字
    Socket tempSocket;
    // 用于读取
    InputStream inSocket;
    // 随机访问文件
    RandomAccessFile inFile = null;
    // 临时缓寸区
    byte byteBuffer[] = new byte[1024];
    // 默认用10000端口监听请求
    int defaultBindPort = 10000;
    // 初始的绑定端口次数为0
    int tryBindTimes = 0;
    // 当前绑定的端口号是10000默认端口
    int currentBindPort = defaultBindPort + tryBindTimes;

    /**
    * @构造方法
    * @抛出异常的原因是无法绑定服务的端口
    * */
    public GetFile(int port) throws Exception {
        try {
            // 绑定服务的端口
            this.bindToServerPort();

        } catch (Exception e) {
            e.printStackTrace();
            // 绑定不成功重试
            System.out.println(e.toString());
            throw new Exception("绑定端口不成功!");

        }
        // 文件选择器以当前的目录打开
        JFileChooser jfc = new JFileChooser(".");
        jfc.showSaveDialog(new javax.swing.JFrame());
        // 获取当前的选择文件引用
        File savedFile = jfc.getSelectedFile();

        // 已经选择了文件
        if (savedFile != null) {
            // 读取文件的数据,可以每次以快的方式读取数据
            inFile = new RandomAccessFile(savedFile, "rw");

        }
    }
   
   /**
    * @监控线程
    */
    public void run() {
        try {
            if (this.inFile == null) {
                System.out.println("没有选择文件");
                // 关闭服务方套接字
                this.serSocket.close();
                // 没有选择文件
                return;
            }
           
            System.out.println("wait for..." + '\n' + "等待对方接入");
            // 等待对方的连接
            tempSocket = serSocket.accept();
            // 五秒钟连不上将抛出异常
            this.serSocket.setSoTimeout(5000);
            // 获取输入流
            this.inSocket = tempSocket.getInputStream();
           
        } catch (Exception ex) {
            System.out.println(ex.toString());
            ex.printStackTrace();
            return;
        }
       
        // 以下为传送文件代码和 套接字清理工作
        int amount;
        try {
            while ((amount = inSocket.read(byteBuffer)) != -1) {
                inFile.write(byteBuffer, 0, amount);
            }
            // 关闭流
            inSocket.close();
            javax.swing.JOptionPane.showMessageDialog(new javax.swing.JFrame(),
                    "已接收成功", "提示!", javax.swing.JOptionPane.PLAIN_MESSAGE);
            System.out.println("Get OK");
            System.out.println("接收完毕!");
            // 关闭文件
            inFile.close();
            // 关闭临时套接字
            tempSocket.close();
            // 关闭服务方套接字
            this.serSocket.close();
           
        } catch (IOException e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

    }

    /**
    * @绑定端口
    * @throws Exception 抛出异常的原因是无法绑定服务的端口
    */
    private void bindToServerPort() throws Exception {
        try {
            // 输出绑定的端口号到当前的控制台上
            System.out.println("试绑定的端口号是:" + this.currentBindPort);
            // 在自己的机器上开一个服务类套接字并等待发送者的连接
            serSocket = new ServerSocket(this.currentBindPort);

        } catch (Exception e) {
            e.printStackTrace();
            // 绑定不成功重试
            System.out.println(e.toString());
            // 试了不止一次了
            this.tryBindTimes = this.tryBindTimes + 1;
           // 可查看试的次数getTryBindedTimes
            this.currentBindPort = this.defaultBindPort + this.tryBindTimes;

            // 如果试的次数超过20次 退出
            if (this.tryBindTimes >= 20) {
                throw new Exception("无法绑定到指定端口" + '\n' + "试了太多次了!");

            }
            // 递归的绑定
            this.bindToServerPort();
        }

        // 输出绑定的端口号到当前的控制台上
        System.out.println("成功绑定的端口号是: " + this.currentBindPort);

    }

    // 获取试绑定的端口
    public int getTryBindedTimes() {
        return this.tryBindTimes;
    }

    // 获取已经绑定的端口
    public int getCurrentBindingPort() {
        return this.currentBindPort;
    }
   

    /**
    * @测试方法
    * @param args
    */
    public static void main(String args[]) {
        GetFile getFile = null;
        try {

            getFile = new GetFile(10000);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("无法传送文件!");
            System.exit(1);
        }
        getFile.start();

    }

}

 

/*文件发送端*/
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.Socket;

import javax.swing.JFileChooser;

/**
* 在服务器端开启的情况下 实例化套接字 并发送文件
*
* @author 
*/
public class SendFile extends Thread {

    // 远程的IP字符串
    String remoteIPString = null;
    // 远程的服务端口
    int port;
    // 临时套接字
    Socket tempSocket;
    // 发送文件用的输出流
    OutputStream outSocket;
    // 欲发送的文件
    RandomAccessFile outFile;
    // 发送文件用的临时缓存区
    byte byteBuffer[] = new byte[1024];

    /**
    * 构造方法仅用于选择发送文件的位置 并从外部接收远程地址和端口
    *
    */
    public SendFile(String remoteIPString, int port) {
        try {
            this.remoteIPString = remoteIPString;
            this.port = port;

           // 选择发送的文件位置
            JFileChooser jfc = new JFileChooser(".");
            File file = null;
            int returnVal = jfc.showOpenDialog(new javax.swing.JFrame());
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                file = jfc.getSelectedFile();

            }

            outFile = new RandomAccessFile(file, "r");

        } catch (Exception e) {
        }
    }

    /**
    * 先决条件是服务器端先开启
    *
    */
    public void run() {
        try {
            this.tempSocket = new Socket(this.remoteIPString, this.port);
            System.out.println("与服务器连接成功!");
            outSocket = tempSocket.getOutputStream();

            int amount;
            System.out.println("开始发送文件...");
            while ((amount = outFile.read(byteBuffer)) != -1) {
                outSocket.write(byteBuffer, 0, amount);
                System.out.println("文件发送中...");
            }
            System.out.println("Send File complete");
            javax.swing.JOptionPane.showMessageDialog(new javax.swing.JFrame(),
                    "已发送完毕", "提示!", javax.swing.JOptionPane.PLAIN_MESSAGE);
            outFile.close();
            tempSocket.close();

        } catch (IOException e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

    }

    /**
    * 测试方法
    *
    * @param args
    */
    public static void main(String args[]) {
        SendFile sf = new SendFile("127.0.0.1", 10000);
        sf.start();

    }
}

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JAVA Socket编程实现文件上传

    在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库中。这个过程涉及到多个关键知识点,下面我们将详细探讨。 1. **Java Socket基础**:...

    java socket 大文件传输,快速传输(包的分片,组装)源码

    在大文件传输中,Socket用于建立客户端与服务器之间的连接,并负责数据的发送和接收。 - **ServerSocket**:服务器端使用ServerSocket监听特定端口,等待客户端的连接请求。 4. **NIO(Non-blocking I/O)** - **...

    java基于socket的文件发送与接收,有界面,有进度条

    当用户点击“发送”按钮时,文件选择的结果会被传递给后台处理线程,该线程负责文件的读取和通过Socket发送。 文件的传输通常采用分块读写的方式,因为一次性读取整个大文件可能会导致内存溢出。可以通过设置合适的...

    利用socket连续发送与连续接收数据

    在Java中,我们可以使用`java.net.Socket`和`java.net.ServerSocket`类来创建和管理Socket。客户端使用`Socket`类创建连接到服务器的实例,而服务器端则使用`ServerSocket`类监听传入的连接请求。 1. **服务器端...

    java socket传输各种格式文件

    在本文中,我们将深入探讨如何利用Java Socket进行不同格式文件的传输,确保数据的完整性和传输速度。 一、Java Socket基础 Java Socket分为ServerSocket和Socket两种类型。ServerSocket用于监听客户端连接,Socket...

    Java Socket PC端传输文件简易服务器客户端

    在Socket通信中,我们通常会将文件内容封装成字节流,然后通过Socket发送。 4. **套接字输入/输出流(SocketInputStream/SocketOutputStream)**: - Socket类提供了与之相关的输入流和输出流,用于在网络中进行...

    Java Socket聊天和文件传输工具

    在这个"Java Socket聊天和文件传输工具"中,开发者利用Socket API创建了一个实用的工具,能够实现用户间的文本聊天功能以及文件的传输。虽然源代码未提供,但我们可以根据已知的信息探讨其背后的原理和技术要点。 1...

    Java Socket聊天和文件传输工具(更新)

    在这个“Java Socket聊天和文件传输工具”中,开发者结合了实时聊天和文件传输的功能,使得用户可以在进行文字交流的同时,无缝地进行文件的交换。这个工具在局域网环境中已经过初步测试,表明其稳定性和效率都达到...

    java socket 视频流转发socket

    在"Java Socket 视频流转发Socket"这个主题中,我们将深入探讨如何使用Java Socket来处理视频流的传输。 首先,让我们了解什么是ServerSocket。在Java中,`java.net.ServerSocket`类是服务器端使用的,它监听特定...

    Java Socket Email 发送接收

    Java Socket电子邮件发送与接收是基于Java网络编程技术实现的一种通信方式,主要涉及到Java的Socket类以及Email相关的API。本项目是一个课程项目,开发者通过几天的努力完成了一个具备图形用户界面(GUI)的邮件系统...

    socket发送接收文件

    在"socket发送接收文件"的过程中,通常采用客户端-服务器模型。服务器端创建一个监听Socket,等待客户端的连接请求。一旦客户端连接成功,双方就可以通过已建立的连接进行数据交换。数据可以是以字节流形式的文件...

    Java 使用Tcpip 发送XML文件

    总的来说,这个Java项目旨在教你如何利用TCP/IP协议在Eclipse环境中开发一个程序,实现在网络上发送和接收XML文件,这对于理解网络编程和XML处理有很好的实践价值。通过学习和实践,你可以增强自己在网络通信和数据...

    java Socket Thread IO 大文件下载上传整合

    Socket允许应用程序通过TCP/IP协议发送和接收数据,为客户端和服务器之间建立连接。 2. **Thread**:在Java中,多线程是并行执行任务的方式,可以提高程序的效率。在大文件下载或上传场景中,使用多线程可以同时...

    java socket多人聊天(文字+图片+文件传输)

    本项目实现了基于Java Socket的多人聊天功能,包括群聊、私聊以及文本、图片和文件的发送与接收,提供了丰富的交互体验。 首先,我们要理解Socket的工作原理。Socket是网络通信的一种端点,它允许两个应用程序通过...

    Java Socket 局域网文件传输

    Java基于Socket实现局域网文件传输,此文件包含了Eclipse项目源码和已经打包好了的.jar文件(文件发送端和文件接收端)。 处在同一局域网内的两台主机,一台运行sender.jar文件(发送端),另一台运行receiver.jar...

    java socket 聊天之传文件

    在这个场景下,我们探讨的是如何使用Java Socket实现一个聊天功能,并且能够传递文件。在博客《Java Socket聊天之传文件》中,作者详细介绍了如何构建这样一个系统。 首先,我们需要理解Java Socket的基本概念。...

    java socket 简单的文件传输程序

    在这个简单的文件传输程序中,我们主要关注的是如何使用Socket进行文件的发送与接收。以下是对该程序可能涉及的关键知识点的详细解释: 1. **Socket基本概念**: - **Socket**:在计算机网络中,Socket像是一种...

    Java Socket传输图片源代码

    在本示例中,我们将深入探讨如何使用Java Socket进行图片的传输,这对于理解网络编程和数据交换至关重要。"Java Socket传输图片源代码"这个主题涵盖了以下几个关键知识点: 1. **Java Socket基础**: - Socket是...

    java-socket大文件上传-含客户端和服务端

    本项目“java-socket大文件上传-含客户端和服务端”旨在演示如何利用Java Socket API来实现大文件的上传功能,这对于网络应用如文件分享、云存储服务等至关重要。 首先,我们要理解Socket的工作原理。Socket是一种...

    Java基于Socket文件传输示例

    在这个示例中,我们将探讨如何利用Java的Socket API进行文件的发送与接收。以下是对"Java基于Socket文件传输示例:服务器端和客户端"的详细解释。 1. **Socket基础知识**: - Socket是网络通信中的一个概念,它...

Global site tag (gtag.js) - Google Analytics