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

socket简单传输文件例子

    博客分类:
  • 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) {
		}
	}
}

 

 

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();
	}
}

 

 

 

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();
	}
}

 

分享到:
评论

相关推荐

    C#Socket文件传输简单例子(将文件名和文件同时传输)

    本示例主要探讨如何使用C#的Socket类进行文件的传输,包括文件名和文件内容的同步发送与接收。这里我们将详细讲解实现这一功能的关键步骤和相关知识点。 首先,了解Socket的工作原理。Socket是TCP/IP协议栈的一部分...

    C#语言Socket传文件例子

    这个“C#语言Socket传文件例子”提供了学习Socket通信和文件传输的实践平台。通过理解和实践这个例子,开发者可以掌握Socket编程的基本技巧,为进一步开发复杂的网络应用打下基础。在实际项目中,还可以考虑增加断点...

    socket传输文件例子demo

    总之,这个"socket传输文件例子demo"是一个实践性的学习资源,可以帮助开发者深入理解如何在VC++环境中利用Socket进行文件传输,同时也可以作为开发自己网络通信软件的基础。通过阅读和分析源代码,我们可以学习到...

    通过Socket传送文件的例子

    本文将基于给定的标题“通过Socket传送文件的例子”和描述来深入探讨Socket编程以及如何利用它进行文件传输。 首先,Socket是网络编程中的一个接口,它允许应用程序通过网络发送和接收数据。在Java中,Socket类提供...

    delphi使用socket通讯例子-文件传输

    在IT行业中,网络通信是软件开发中的重要组成部分,特别是在分布式系统和实时数据交换的应用中。...在实际应用中,你可能需要对这个基础进行扩展,例如支持多文件传输、进度显示、断点续传等功能。

    socket文件传输(TCP)源码实例

    这个"文件传输TCP例子"源码将涵盖以上提到的关键步骤,并提供一个实际的示例来演示如何在Linux环境下实现TCP文件传输。通过阅读和分析源码,你可以深入理解TCP socket编程的细节,这对于开发网络应用程序,特别是...

    关于C语言 socket数据 文件传输的例子

    在IT领域,网络编程是不可或缺的一...这个例子提供了从发送端到接收端的文件传输实现,对于理解C语言socket编程和网络文件传输的原理非常有帮助。通过实践和调试这样的代码,可以深入理解和掌握网络编程的核心技术。

    VC socket传送文件的例子(转载)

    此外,为了提高效率,文件传输可能需要实现断点续传功能,允许在传输中断后从上次断点继续。 标签"VC socket传送文件的例子(转载)"表明这个示例可能是从其他来源获取的,这提醒我们在使用时要尊重版权,同时也要...

    一个使用socket实现文件传输的例子

    在计算机网络中,Socket编程是一种基础且重要的...这个系统虽然简单,但足以展示Socket编程的基本原理和文件传输的核心逻辑。在实际项目中,可以根据需求进一步扩展和优化,例如添加身份验证、支持多种文件传输协议等。

    Java基于Socket文件传输示例:服务器端和客户端

    服务器端的核心是监听特定端口(在这个例子中是8821)上的连接请求,并在接收到连接后传输文件。以下是关键步骤: 1. **创建ServerSocket**:`ServerSocket ss = new ServerSocket(port);` 这行代码初始化了一个...

    socket传文件例子.txt

    在IT领域,尤其是在网络编程中,使用socket进行文件传输是一个常见的需求。从提供的代码片段来看,这是一段基于C语言实现的socket服务器端程序,主要功能是通过TCP连接接收客户端发送的信息,并向客户端发送文件。...

    Socket编程简单例子

    在Android应用开发中,Socket通信常用于实现即时通讯、文件传输等功能,例如聊天应用、在线游戏等。 总结一下,这个“Socket编程简单例子”涵盖了以下知识点: 1. Socket的基本原理和作用 2. 在Android客户端创建...

    socket传输文件实例

    在这个"socket传输文件实例"中,我们将深入探讨如何利用Socket在不同计算机之间交换文件。Socket提供了低级别的、面向连接的、双向通信协议,是TCP/IP协议族的一部分。下面我们将详细讲解相关知识点。 一、Socket...

    文件传输源代码实例(Socket)

    这个是我自己编写的网络传输,主要可以传输文件和信息(支持多文件多用户传输)。用C#编写,使用了Socket。包含了一个传输类,一个数据库连接类。是学习网络传输的好帮手。(完整源代码,采用VS2005编写)绝对可以...

    Socket传输大文件

    可能工作中很少会用到Java写传输文件的程序,但是当这一需求来临之时,你可能会发现用Socket来传输大文件并不像想象中简单。最近花了不少功夫才实现了这一功能,能够快速、无差错地传输2G大的文件。现发上来跟有需要...

    Socket编程例子

    在提供的"TestSocket"文件中,可能包含了一个简单的Socket通信实例,可能包括了客户端和服务器的代码。客户端代码通常会包含创建Socket、连接服务器、发送数据和关闭Socket的过程。服务器端则涉及创建Socket、绑定...

    SOCKET 文件传输

    但是,你可以参考以下简单的Python示例,它演示了如何使用TCP Socket进行文件传输: ```python import socket # 服务器端 def server(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('...

    TCP.rar_TCP 传输_TCP 文件传输_socket+文件传输_tcp文件传输_文件传输 C

    描述中的"socket 文件传输,基于TCP的文件传输,是个不错的例子"进一步强调了: 1. **Socket文件传输**:通过socket接口,开发者可以直接控制TCP连接,实现文件的发送和接收,这对于跨网络的文件共享和备份尤其有用...

Global site tag (gtag.js) - Google Analytics