`
JingAi_jia
  • 浏览: 7499 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

Socket实现多张图片的传送

阅读更多

最近在做一个项目是要用到Socket实现从服务器端的指点目录下传输多张图片到客户端,备份服务器端的图片,同时删除原来的图片。我的客户端时android的。在开发过程中,我先用java测试通过后在移植到android上。我也是最近才接触socket,想实现上述功能,到网上找了一些资料没有找到满意的。后来就结合网上找的资料自己摸索,实现了上述功能,于是想分享一下,希望对各位有帮助。废话不说,直接上代码,如有雷同,请多多包涵。
服务器端:

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
        //定义要读取的图片的路径
public static final String IMAGE_PATH = "D:" +File.separator+ "ftp_temp" + File.separator;
        //图片备份的文件夹路径
public static final String TEMP_IMAGE_PATH = IMAGE_PATH + "temp" + File.separator;


public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(9999);
Socket client = server.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
System.out.println("start server...");
String line = reader.readLine();
System.out.println("line -- > " + line);
out = readImagesFromCard(out);
out.flush();
out.close();
client.close();
server.close();
} catch(Exception e) {
e.printStackTrace();
}
}
//读取图片,并存放在socket下的outputStream输出流中
public static DataOutputStream readImagesFromCard(DataOutputStream dos) {
File[] files = null;
try {
InputStream inputStream = null;
int size = 2 * 1024;
byte[] buffer = new byte[size];
byte[] b = null;
int len;
String path = IMAGE_PATH;
File file = new File(path);
if(file.isDirectory()) {
files = file.listFiles();
for(int i = 0 ; i < files.length ; i ++) {
len = -1;
if(files[i].isFile()) {
inputStream = readImage(files[i]);
dos.writeUTF(files[i].getName());
dos.writeLong(files[i].length());
while((len = inputStream.read(buffer)) != -1) {
dos.write(buffer, 0, len);
if(len != size) {//如果该图片的字节数不是size的倍数,则填满size个字节
b = new byte[size - len];
dos.write(b,0,b.length);
} 
}
 //先关闭该文件的输入流,否则无法删除
inputStream.close();
files[i].delete();
}
}
dos.writeUTF("end");
}
} catch(Exception e) {
e.printStackTrace();
}
return dos;
}

        //如果该图片没有备份,则先备份,最后返回该文件的InputStream输入流
public static InputStream readImage(File file) {
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
File tempFile = new File(TEMP_IMAGE_PATH + file.getName());
if(!tempFile.exists()) {
tempFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(tempFile);
byte[] buffer = new byte[2 * 1024];
int len = -1;
while((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
inputStream = null;
inputStream = new FileInputStream(file);
}
} catch(Exception e) {
e.printStackTrace();
}
return inputStream;
}
}

 


客户端:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

private static final String PATH = "D:" + File.separator + "temp" + File.separator;

public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9999);
PrintWriter out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
System.out.println("start client....");
out.println("sendImage");
out.flush();
System.out.println("sendImage....");
byte[] buffer = new byte[2 * 1024];
int len = -1;
String imageName = null;
FileOutputStream fos = null;
File file = null;
long fileLength = -1;
while(true) {
imageName = inputStream.readUTF();
if(imageName != null && imageName.trim().equals("end")) {
break;
}
file = new File(PATH + imageName);
if(!file.exists()) {
file.createNewFile();
} else if(file.isFile()) {
file.delete();
file.createNewFile();
} else if(file.isDirectory()) {
continue;
}
fileLength = inputStream.readLong();
len = -1;
fos = new FileOutputStream(file);
while(fileLength > 0) {
len = inputStream.read(buffer);
fos.write(buffer, 0, len);
if(len != -1) {
fileLength -= len;
}
}
fos.flush();
fos.close();
fos = null;
imageName = null;
file = null;
}
out.close();
socket.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
 

 

第一次发表文件,对各位造成的不便请多多包涵。

0
2
分享到:
评论
2 楼 yuzhibofei123 2013-10-24  
楼主的代码只能在同一台机子上运行,放在两台不同的机子就不行了,会出现编码的问题
1 楼 晓夕哈哈 2012-10-09  
楼主,在android客户端,还是只能出现一张图片,指出imageName = inputStream.readUTF();   有错误。您是怎么改的?能否具体再传一下代码?或者直接发给我邮箱:chunxiyuacao@163.com

相关推荐

    Android_Socket_客户端和服务器端,支持多张图片同时传送,自定义协议头

    本项目"Android_Socket_客户端和服务器端,支持多张图片同时传送,自定义协议头"着重解决了如何通过Socket实现在Android设备上进行图片的高效传输,并且通过自定义协议头来增强数据传输的安全性和可靠性。...

    利用Socket传送图片

    总之,“利用Socket传送图片”是一个很好的实践项目,它涵盖了网络编程、多线程和并发控制等多个重要概念。通过这个项目,开发者可以提升在网络通信和并发编程方面的技能,为今后的项目开发打下坚实基础。

    网络编程(socket)文件图片等传送

    在文件和图片的传送中,由于其对数据完整性的要求较高,通常选择TCP作为传输协议。 在给定的文件中,`TcpFileClient`和`TcpFileServer`分别代表了客户端和服务器端的实现。客户端(TcpFileClient)负责发起连接请求...

    android客户端用socket不间断传输图片

    利用DataOutputStream和DataInputStream实现由android客户端利用Socket向java服务器不间断传输图片,很好用。之间试过由OutpuStream.write(byte[])以及先将图片byte[]通过Base64加密转换为String再发送,效果都不好...

    C# Socket 分包传送数据

    本资源聚焦于“C# Socket分包传送数据”,特别是涉及图片这种大文件的传输策略。以下是对这个主题的详细讲解: 首先,理解Socket的基本概念。Socket是网络编程中的一个接口,它是进程间通信(IPC)在网络层面上的...

    windows下socket 实例(可以传输图片,压缩包等较大文件)

    本示例专注于演示如何通过Socket实现在本地网络环境中传输大文件,如图片、压缩包等。在实际应用中,Socket接口提供了低级别的网络通信能力,可以灵活地处理各种数据类型和文件大小。 【知识点详解】: 1. **...

    C++OpenCv利用Socket通讯类传输图片或者视频

    C++结合OpenCV库,可以实现高效、稳定的图像和视频处理,并通过Socket进行网络通信。以下将详细介绍如何利用C++和OpenCV通过Socket来传输图片或视频。 首先,**OpenCV** 是一个强大的计算机视觉库,提供了丰富的...

    VC socket(网络编程)文件图片等传送(下)

    在本文中,我们将深入探讨如何使用VC++进行网络编程,特别是通过socket实现文件和图片的传输。网络编程是计算机通信的基础,而socket是其核心组件,它提供了进程间通信(IPC)的能力,允许不同计算机之间的应用程序...

    MFC 用SOCKET实现图片分包传送和接收并作校验,并显示图片C++

    基于对话框的应用程序,可以实现从客户端向服务器发送图片,在客户端先对图片进行打包处理,进行分包发送(包中附带校验信息,以便于在服务器端能根据此验证信息来接收数据包,还附带有包的次序,以便在服务器端按此...

    VC socket(网络编程)文件图片等传送(上)

    本篇文章将深入探讨如何使用VC++(Visual C++)进行Socket编程,特别是涉及文件和图片的传输。 首先,Socket是操作系统提供的一个接口,它允许应用程序通过网络发送和接收数据。在VC++中,我们通常使用Windows ...

    socket通讯文件传送源码

    总之,这个源码涵盖了C#中的Socket通信、文件传输、图片处理和聊天功能实现等多个方面,是学习和实践网络编程的宝贵资料。通过深入研究这个源码,开发者可以更好地理解如何在实际项目中应用这些技术,提升自己的编程...

    服务端,,客户端通过socket传送图像

    "服务端与客户端通过socket传送图像"这个主题聚焦于如何利用Socket编程技术在VC++环境下实现实时的图像数据传输。Socket是一种在不同计算机之间建立连接、交换数据的基础组件,它为应用程序提供了底层的网络通信接口...

    TCP socket 套接字传送文件

    socket编程是实现这一功能的基础。 在Linux环境下,TCP套接字文件传输涉及以下主要步骤: 1. **创建服务器Socket**: - 使用`socket()`函数创建一个套接字。例如: ```c int server_socket = socket(AF_INET, ...

    Linux环境下C语言Socket编程——客户端向服务端单次发送一个或多个文件的功能

    网上很多有关socket文件传输的源码都是每次只能发送一个文件,如果想传输多个文件,不但需要多次交互,还需要把每个文件的文件名都输入进去,很不方便,所以进行了一个小扩展:即客户端可以将打算传送的多个文件都先...

    java 聊天室之 传送图片文字等功能的实现

    【标题】:“Java聊天室之传送图片文字等功能的实现” 这个标题揭示了我们将要探讨的是一个基于Java开发的聊天室应用程序,它具有发送文本消息以及传输图像等多媒体功能。在Java编程领域,创建一个聊天室涉及到网络...

    pda传送图片代码

    综上所述,PDA传送图片代码不仅涵盖了C#、ASP.NET、文件传输以及网络通信的基础知识,还涉及到了具体的实现细节,如用户界面设计、文件流操作、网络请求构造等,对于理解和掌握现代Web开发和移动设备应用开发具有...

    聊天,文件,图片传送一体的小程序

    【标题】"聊天,文件,图片传送一体的小程序"揭示了这个项目的核心功能,它是一个集成了文字聊天、文件传输和图片分享的轻量级应用。这种类型的应用通常基于网络通信技术,允许用户通过互联网进行实时交流。在这个小...

    VC/MFC实现简单的Http服务器(可访问图片和网站内页)

    这通常通过创建一个套接字(socket),然后调用bind和listen函数来完成。bind函数将套接字与IP地址和端口号绑定,listen函数设置服务器为监听模式,准备接受连接。 当有新的客户端连接请求时,accept函数会返回一个...

    TCP协议实现文件传输

    在TCP协议中实现文件传输是一项基础且重要的任务,它依赖于可靠的面向连接的服务,确保数据在互联网上传输时的完整性和顺序。在这个过程中,程序通常分为发送端和接收端两个部分,通过一系列步骤来实现文件的高效、...

Global site tag (gtag.js) - Google Analytics