浅析Java基于Socket的文件传输案例

本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下

1、Java代码

package com.wf.demo.socket.socketfile; 

import java.net.*;
import java.io.*; 

/**
 * 2.socket的Util辅助类
 *
 * @author willson
 *
 */
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) {
    }
  }
} 

2、Java代码

package com.wf.demo.socket.socketfile; 

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket; 

/**
 * 1.服务器端
 *
 * @author willson
 *
 */
public class ServerTest { 

  int port = 8821; 

  void start() { 

    Socket socket = null; 

    try { 

      ServerSocket serverSocket = new ServerSocket(port); 

      while (true) {
        // 选择进行传输的文件
        String filePath = "E:\\lib.zip"; 

        File fi = new File(filePath); 

        System.out.println("File Name:" + fi.getName() + ";\tFile Size():" + (int) fi.length() + "bytes"); 

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

        System.out.println("等待客户端连接,连接端口:" + port);
        socket = serverSocket.accept(); 

        System.out.println("建立socket链接"); 

        DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 

        dis.readByte(); 

        DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); 

        DataOutputStream ps = new DataOutputStream(socket.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();
        // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
        // 直到socket超时,导致数据不完整。
        fis.close();
        socket.close(); 

        System.out.println("文件传输完成\n");
      } 

    } catch (Exception e) {
      e.printStackTrace();
    }
  } 

  public static void main(String arg[]) {
    new ServerTest().start();
  }
}

3、客户端

package com.wf.demo.socket.socketfile; 

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

/**
 * 3.客户端
 *
 * @author willson
 *
 */
public class ClientTest { 

  private ClientSocket cs = null; 

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

  private int port = 8821; 

  private String sendMessage = "Windwos"; 

  public ClientTest() { 

    try {
      if (createConnection()) {
        sendMessage();
        getMessage("F:\\");
      }
    } 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(String savePath) { 

    if (cs == null)
      return;
    DataInputStream inputStream = null;
    try {
      inputStream = cs.getMessageStream();
    } catch (Exception e) {
      System.out.print("接收消息缓存错误\n");
      return;
    } 

    try { 

      // 本地保存路径,文件名会自动从服务器端继承而来。
      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("File Size():" + len + "bytes");
      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 ClientTest();
  }
}

希望本文所述对大家学习java程序设计有所帮助。

(0)

相关推荐

  • java 实现局域网文件传输的实例

    java 实现局域网文件传输的实例 本文主要实现局域网文件传输的实例,对java 的TCP知识,文件读写,Socket等知识的理解应用,很好的实例,大家参考下, 实现代码: ClientFile.java /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ package com.tcp.file; import java.io.File; import java.io.FileInputStream; import java.io.

  • Java基于Socket的文件传输实现方法

    本文实例讲述了Java基于Socket的文件传输实现方法.分享给大家供大家参考,具体如下: 1. Java代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Ser

  • Java Socket实现文件传输示例代码

    最近学Socket学上瘾了,就写了一个简单的文件传输程序. 客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端.传输的进度打印到控制台中,直到传输完成. 服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名. 下面是客户端和服务端的代码实现: 客户端代码: import java.io.DataOutpu

  • Java基于TCP方式的二进制文件传输

    一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1.基于Java Socket的二进制文件传输(包括图片,二进制文件,各种文档work,PDF) 2.SwingWorker集合JProgressBar显示实时传输/接受完成的百分比 3.其它一些Swing多线程编程技巧 首先来看一下整个Dome的Class之间的关系图: 下面按照上图来详细解释各个类的

  • Java IO流 文件传输基础

    一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String s="好好学习ABC"; byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是

  • 基于socket和javaFX简单文件传输工具

    本文实例介绍了基于socket和javaFX简单文件传输工具,分享给大家供大家参考,具体内容如下 package application; import java.io.File; import org.james.component.ButtonBox; import org.james.component.FileReceiverGrid; import org.james.component.FileSenderGrid; import javafx.application.Applica

  • 浅析Java基于Socket的文件传输案例

    本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下 1.Java代码 package com.wf.demo.socket.socketfile; import java.net.*; import java.io.*; /** * 2.socket的Util辅助类 * * @author willson * */ public class ClientSocket { private String ip; private int port; private

  • java基于socket传输zip文件功能示例

    本文实例讲述了java基于socket传输zip文件的方法.分享给大家供大家参考,具体如下: 服务器端程序: import java.io.*; import java.net.*; import java.io.BufferedInputStream; public class SocketServer { ServerSocket ss=null; Socket s=null; DataInputStream inStream=null; DataOutputStream outStream

  • java基于Socket做一个简单下载器

    本文实例为大家分享了java基于Socket制作下载器的过程,及相关代码,供大家参考,具体内容如下 1.首先要建立一个服务器用来处理信息并给客户端传输文件(电脑)  我是用电脑开了一个WIFI,手机连上后使用scoket传输的  SERVERIP要根据自己实际情况更改.端口也可以随便更改0~65535,尽量选大一点 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Buf

  • Java基于Socket实现简单的多线程回显服务器功能示例

    本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能.分享给大家供大家参考,具体如下: 需要两个类,一个是EchoServer,代表服务器.另外一个是EchoServerClient,代表客户端.代码如下: package interview; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter

  • Java基于socket服务实现UDP协议的方法

    本文实例讲述了Java基于socket服务实现UDP协议的方法.分享给大家供大家参考.具体如下: 示例1: 接收类: package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPReceiveDemo { public static void main(String[] args) throw

  • python基于FTP实现文件传输相关功能代码实例

    这篇文章主要介绍了python基于FTP实现文件传输相关功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本实例有文件传输相关功能,包括:文件校验.进度条打印.断点续传 客户端示例: import socket import json import os import hashlib CODE = { '1001':'重新上传文件' } def file_md5(file_path): obj = open(file_path,'rb

  • Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.java 客户端实例 ChatClient.java package socketDemo; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class Ch

  • Python实现基于socket的udp传输与接收功能详解

    本文实例讲述了Python实现基于socket的udp传输与接收功能.分享给大家供大家参考,具体如下: udp的传输与接收 windows网络调试助手下载:https://pan.baidu.com/s/1IwBWeAzGUO1A3sCWl20ssQ 提取码:68gr 或者点击此处本站下载. 一.基本用法 1.创建套接字 udp_socket = socket.socket(socket.AF_INET,cosket.SOCK_DGRAM) localaddr = ("",port)

  • python3.5基于TCP实现文件传输

    本文实例为大家分享了python3.5基于TCP实现文件传输的具体代码,供大家参考,具体内容如下 服务器代码 # _*_ coding:utf-8 _*_ from socket import * import _thread def tcplink(skt,addr): print(skt) print(addr,"已经连接上...") print('开始发送文件') with open('./ww.jpg', 'rb') as f: for data in f: print(dat

随机推荐