清明节放完假刚回来,马上进入到写博文的节奏,今天继续来学习关于传统的Socket编程 - 客户端与服务器端如何进行文件传送的。
在这之前,先来回顾一下上一篇‘Java Socket 01- 常识篇之消息处理’所讲到的内容: 1) 发送消息前如何对消息进行处理 2) 对消息如何进行编码 3)接收消息时如何对消息进行处理 4)发送端与接收端如何进行“对话”式的交互。其中讲到两个重要的概念:① 显式长度(Explicit length) ②基于定界符(Delimiter-based)。
文件的传送包括了两部分:文件的发送与文件的接收。文件发送端、文件的接收端这里分别简称为发送端、接收端。文件的传送也需要发送端与接收端协议好如何传送,比如,文件名,文件内容如何发送,谁先谁后,怎么编码等等。
这里用简单的方法来完成文件的传送:首先发送文件名的长度,然后使用文件名,再发送文件内容的长度,最后发送文件的内容。这里先所以下规则,文件名的长度占4个字节,文件内容的长度占8个字节。如下图:
附件会带上一个完整的源码:(下图是效果图)
下面来一段主要的源码(发送端):
public void uploadFile(String sPath) throws IOException { long lStart = System.currentTimeMillis(); // check the precondition FileInputStream oFileInput = new FileInputStream(new File(sPath)); FileChannel oChannel = oFileInput.getChannel(); // the File length long lLen = oChannel.size(); // the file name String sFileName = sPath.substring(sPath.lastIndexOf(File.separator) + 1); byte[] bFileName = sFileName.getBytes("utf-8"); // 发送文件名的长度和文件名到接收端 m_handler.out().write(BasicTypeConverter.intToByte(bFileName.length)); m_handler.out().write(bFileName); m_handler.out().flush(); // 发送文件内容的长度和文件内容到接收端 m_handler.out().write(BasicTypeConverter.longToByte(lLen)); m_handler.out().flush(); ByteBuffer oBuffer = ByteBuffer.allocate(1024); while (oChannel.read(oBuffer) != -1) { oBuffer.flip(); if (oBuffer.hasRemaining()) { m_handler.out().write(oBuffer.array(), 0, oBuffer.limit()); m_handler.out().flush(); } oBuffer.clear(); } oFileInput.close(); oChannel.close(); long lEnd = System.currentTimeMillis(); long lUseTime = lEnd - lStart; ClientFrame.self.setMsg("文件已经发送完成 ;文件大小:" + lLen/1024 + "KB; 共耗时:"+ lUseTime + "ms ----> "+ sPath); }
如果对FileChannel 和ByteBuffer不了解,请看一下之前我写的博文,Java NIO里面有提到。这里给个链接http://jimmyhr.iteye.com/admin/categories/272010
下面是一段主要的源码(接收端):
@Override public void run() { try { // 文件名的长度 byte[] bHeadLength = new byte[4]; if (m_oIn.read(bHeadLength) == -1) { return; } // 获得文件名的长度 int iLen = BasicTypeConverter.bytesToInt(bHeadLength); // 获得文件名 ByteBuffer oBuffer = ByteBuffer.allocate(iLen); int iR = 0; while (oBuffer.hasRemaining()) { byte[] b = new byte[iLen - iR]; iR += m_oIn.read(b); oBuffer.put(b); } String sFileName = new String(oBuffer.array(), "UTF-8"); // 文件的长度 bHeadLength = new byte[8]; m_oIn.read(bHeadLength); long lFileLen = BasicTypeConverter.byteToLong(bHeadLength); // 接收文件并保存 long lHasRev = 0; File oFile = new File(SAVEPATH + sFileName); if (!oFile.exists()) { File oDir = oFile.getParentFile(); if (!oDir.exists()) { oDir.mkdirs(); } oFile.createNewFile(); } FileOutputStream oOut = new FileOutputStream(oFile); while (lHasRev < lFileLen) { int iAvail = m_oIn.available(); byte[] b = new byte[Math.min((int) (lFileLen - lHasRev), iAvail)]; int iRev = m_oIn.read(b); lHasRev += iRev; oOut.write(b, 0, iRev); oOut.flush(); } oOut.close(); ServerFrame.m_oFrame.setMsg("文件已经保存在:" + SAVEPATH + sFileName); } catch (Exception e) { e.printStackTrace(); } finally { try { m_oSocket.close(); if (m_oIn != null) { m_oIn.close(); } if (m_oOut != null) { m_oOut.close(); } } catch (IOException e) { e.printStackTrace(); } } }
这里可能大家注意到 接收完成后,关闭Socket连接。所以例子中现在只支持单文件传送。大家不妨试试搞一下如何多文件传送。
相关推荐
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 socket 的典型应用就是 ...
在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库中。这个过程涉及到多个关键知识点,下面我们将详细探讨。 1. **Java Socket基础**:...
Java Socket 客户端-服务器通信是网络编程中的基础概念,它允许两个应用程序通过TCP/IP协议进行双向通信。在这个场景中,"client-server"指的是Java编程环境下实现的客户端Socket连接到服务端Socket的过程。源码和...
通过上述步骤,我们可以实现一个简单的Java Socket文件传输小案例。不过,实际项目中还需要考虑更多因素,如文件的大小限制、错误重试机制、网络状况的适应性等。在不断实践和学习中,我们可以逐步掌握更复杂的网络...
根据提供的文件信息,本文将详细解析Java中利用Socket进行文件(包括图片)传输的相关知识点。 ### Java Socket基础知识 在深入探讨文件传输之前,我们先简要回顾一下Java Socket的基础概念。Socket是一种允许不同...
Java Socket 大文件传输是网络编程中的一个关键领域,它涉及到高效的数据传输、包的分片与组装,以及网络协议的选择。在这个场景下,我们通常会用到TCP和UDP这两种传输层协议,以及Java的非阻塞I/O(NIO)技术。下面...
在这个“Java网络编程-Socket-文件传输小案例”中,我们将深入探讨如何利用Java的Socket API进行文件的传输。首先,我们需要了解Socket的基本概念。 Socket,通常被称为套接字,是网络编程中的一个接口,它允许两个...
在"Java Socket PC端传输文件简易服务器客户端"这个项目中,我们主要会涉及以下知识点: 1. **Java Socket类**: - Socket类代表了网络上的一个连接,它包含了IP地址和端口号。通过创建Socket实例,客户端可以连接...
在本文中,我们将深入探讨如何利用Java Socket进行不同格式文件的传输,确保数据的完整性和传输速度。 一、Java Socket基础 Java Socket分为ServerSocket和Socket两种类型。ServerSocket用于监听客户端连接,Socket...
本篇主要介绍Java中的Socket编程,特别是如何利用Socket进行文件传输。 首先,理解Socket的基本概念。Socket可以被视为网络上的一个端点,它允许两个程序通过网络进行通信。在Java中,`java.net.Socket`类代表...
总的来说,这个简单的文件传输程序利用了Java Socket API实现了客户端和服务器之间的文件交换,虽然它可能没有涵盖高级特性,如断点续传、错误恢复或性能优化,但对于理解和学习Socket编程基础是很有帮助的。...
本项目“java-socket大文件上传-含客户端和服务端”旨在演示如何利用Java Socket API来实现大文件的上传功能,这对于网络应用如文件分享、云存储服务等至关重要。 首先,我们要理解Socket的工作原理。Socket是一种...
在这个"Java Socket聊天和文件传输工具"中,开发者利用Socket API创建了一个实用的工具,能够实现用户间的文本聊天功能以及文件的传输。虽然源代码未提供,但我们可以根据已知的信息探讨其背后的原理和技术要点。 1...
* 网络数据传输实验:使用 Java Socket 编程可以实现网络数据传输,例如文件传输、文字传输等。 * 网络游戏实验:使用 Java Socket 编程可以创建网络游戏,例如多人在线游戏。 Java Socket 编程的实验步骤 在...
在这个“Java Socket聊天和文件传输工具”中,开发者结合了实时聊天和文件传输的功能,使得用户可以在进行文字交流的同时,无缝地进行文件的交换。这个工具在局域网环境中已经过初步测试,表明其稳定性和效率都达到...
Java Socket实现的点对点(P2P)文件传输是一个涉及网络编程、Java I/O以及多线程的重要技术。在Java中,Socket是基于TCP协议的网络通信接口,提供了两台计算机之间稳定的数据交换能力。P2P网络,即对等网络,允许...
总的来说,这个项目提供了一个基础的Socket文件传输模型,通过实践可以加深对Java网络编程的理解,为构建更复杂的应用,如聊天室、文件共享系统等打下坚实基础。对于开发者来说,熟练掌握Socket编程不仅可以增强解决...
在本示例中,我们将深入探讨如何使用Java Socket进行图片的传输,这对于理解网络编程和数据交换至关重要。"Java Socket传输图片源代码"这个主题涵盖了以下几个关键知识点: 1. **Java Socket基础**: - Socket是...