`
san_yun
  • 浏览: 2654571 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java socket远程读取文件性能测试

 
阅读更多

为了比较beansdb,写了一个基于socket的java文件读取测试。

 

 server:

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;

import org.apache.commons.io.FileUtils;

import com.taobao.tlog.util.NamedThreadFactory;

public class FileServer {

	public void run() throws IOException {

		bosses.submit(new Boss());

	}

	static ExecutorService bosses = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("boss", false));
	static ExecutorService workers = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("worker", false));

	private static class Boss implements Callable {

		@Override
		public Object call() throws Exception {
			ServerSocket server = new ServerSocket(8080);
			while (true) {
				Socket socket = server.accept();
				workers.submit(new Wroker(socket));
			}
		}
	}

	private static class Wroker implements Callable {

		Socket socket;
		PushbackInputStream input;

		public Wroker(Socket socket) throws IOException {
			this.socket = socket;
			input = new PushbackInputStream(socket.getInputStream(), 1);
		}

		protected void receive(String path) throws IOException {
			File file = new File(path);
			byte[] data = FileUtils.readFileToByteArray(file);
			OutputStream output = socket.getOutputStream();
			output.write(data);
			output.flush();
			System.out.println(path+" flush");
		}

		public void accept() throws Exception {
			int bytesToRead = 0;
			while (true) {
				bytesToRead = input.available();
				if (bytesToRead > 0) {
					byte[] t = new byte[45];
					input.read(t);
					String path = new String(t);
//					System.out.println("path=" + path);
					receive(path);
				} else {
					int b = input.read(); // 此操作会阻塞,直到有数据被读到
					if (b < 0) {
						throw new IOException(
								" end of the socket input stream has been reached,may be server socket is closed!");
					} else {
						input.unread(b);
						continue;
					}

				}
			}
		}

		@Override
		public Object call() {
			while (true) {
				try {
					accept();
				} catch (Exception e) {
					e.printStackTrace();
					System.exit(-1);
				}
			}
		}

	}

	public static void main(String[] args) throws IOException {
		new FileServer().run();
	}
}

 

client

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PushbackInputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.text.DecimalFormat;
import java.util.Random;

public class FileClient {

	static Random random = new Random();

	Socket socket;
	PushbackInputStream input;

	public FileClient() throws IOException {
		init();
	}

	public void init() throws IOException {
		socket = new Socket();
		socket.setReuseAddress(true);
		socket.setKeepAlive(true);
		socket.setTcpNoDelay(true);
		socket.setSoLinger(true, 0);
		socket.setSoTimeout(60000);
		socket.connect(new InetSocketAddress("localhost", 8080), 60000);
		input = new PushbackInputStream(socket.getInputStream(), 1);
	}

	public void send(String path) throws IOException {
//		System.out.println(path);
		OutputStream out = socket.getOutputStream();
		OutputStreamWriter writer = new OutputStreamWriter(out);
		writer.write(path);
		writer.flush();
	}

	/**
	 * 	System.out.println("readed:" + readBytes + ",bytesToRead:" + bytesToRead);
	 *  <pre>
	 *  readed:-1,bytesToRead:0
	 *	readed:-1,bytesToRead:180224
	 *	readed:131072,bytesToRead:376831
	 *	readed:262144,bytesToRead:344063
	 *	readed:393216,bytesToRead:324300
	 *	readed:524288,bytesToRead:193228
	 *	readed:655360,bytesToRead:62156
	 *	readed:717516,bytesToRead:0
	 * </pre>
	 * @throws IOException
	 */
	public void readLine() throws IOException {

		int bytesToRead = 0;
		int readBytes = -1;
		while (true) {
			bytesToRead = input.available();
			if (readBytes >= 717516) {
				break;
			}
			if (bytesToRead > 0) {
				byte[] data = new byte[bytesToRead];
				readBytes += input.read(data);
			} else {
				int b = input.read(); // 此操作会阻塞,直到有数据被读到
				if (b < 0) {
					throw new IOException(
							" end of the socket input stream has been reached,may be server socket is closed!");
				} else {
					input.unread(b);
					continue;
				}

			}
		}
	}

	public void test() throws IOException {

		DecimalFormat df = new DecimalFormat("#00");
		long begin = System.currentTimeMillis();
		for (int i = 0; i < 100; i++) {
			int id = random.nextInt(10000);
			int month = id % 12 + 1;
			int day = id % 30 + 1;
			int ix = id % 99 + 1;
			String file = "/duitang/data/pic_test/2013/" + df.format(month) + "/" + df.format(day) + "/HDFS"
					+ df.format(ix) + ".jpeg";
			send(file);
			readLine();
		}
		long end = System.currentTimeMillis();
		System.out.println((end - begin) + "ms ");
	}

	public static void main(String[] args) throws IOException {
		FileClient client = new FileClient();
		for (int i = 0; i < 10; ++i) {
			client.test();
		}
	}
}

 

测试数据准备,测试数据按照/year/month/day/data 存放,一共36000张图片:

import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

import org.apache.commons.io.FileUtils;

public class FileUtil {

	public static void buildData() throws IOException {
		DecimalFormat format = new DecimalFormat("#00");

		String path = "/duitang/data/pic_test/2013";
		for (int month = 1; month < 13; ++month) {

			File mongthPath = new File(path, format.format(month));
			mongthPath.mkdirs();
			for (int day = 1; day < 31; ++day) {

				File dayPath = new File(mongthPath, format.format(day));
				dayPath.mkdirs();
				
				for (int i = 1; i < 100; ++i) {
					FileUtils.copyFile(new File("/tmp/HDFS.jpeg"), new File(dayPath, "HDFS" + format.format(i)
							+ ".jpeg"));
				}
			}
		}
	}

}

 

在我笔记本上的性能:

187ms 
174ms 
157ms 
169ms 
171ms 
154ms 
168ms 
155ms 
163ms 
164ms 

 产生的图片请求,确保是随机的:

/duitang/data/pic_test/2013/03/27/HDFS48.jpeg flush
/duitang/data/pic_test/2013/09/09/HDFS39.jpeg flush
/duitang/data/pic_test/2013/02/08/HDFS74.jpeg flush
/duitang/data/pic_test/2013/06/12/HDFS87.jpeg flush
/duitang/data/pic_test/2013/08/08/HDFS50.jpeg flush
/duitang/data/pic_test/2013/01/07/HDFS79.jpeg flush
/duitang/data/pic_test/2013/10/16/HDFS52.jpeg flush
/duitang/data/pic_test/2013/02/08/HDFS47.jpeg flush
/duitang/data/pic_test/2013/07/19/HDFS88.jpeg flush
/duitang/data/pic_test/2013/05/29/HDFS14.jpeg flush
/duitang/data/pic_test/2013/08/20/HDFS71.jpeg flush
/duitang/data/pic_test/2013/08/20/HDFS26.jpeg flush
/duitang/data/pic_test/2013/03/09/HDFS45.jpeg flush
/duitang/data/pic_test/2013/03/15/HDFS36.jpeg flush
/duitang/data/pic_test/2013/09/21/HDFS39.jpeg flush
/duitang/data/pic_test/2013/11/23/HDFS53.jpeg flush
/duitang/data/pic_test/2013/04/10/HDFS64.jpeg flush
/duitang/data/pic_test/2013/02/26/HDFS80.jpeg flush
/duitang/data/pic_test/2013/09/27/HDFS06.jpeg flush
/duitang/data/pic_test/2013/01/07/HDFS46.jpeg flush
/duitang/data/pic_test/2013/04/16/HDFS19.jpeg flush
/duitang/data/pic_test/2013/10/10/HDFS88.jpeg flush
/duitang/data/pic_test/2013/05/11/HDFS29.jpeg flush
/duitang/data/pic_test/2013/08/14/HDFS86.jpeg flush
/duitang/data/pic_test/2013/07/07/HDFS85.jpeg flush
/duitang/data/pic_test/2013/09/21/HDFS51.jpeg flush

 

disable linux cache后:
普通FS
326 ms 
286 ms 
303 ms 
292 ms 
296 ms 
283 ms 
292 ms 
290 ms 
273 ms 
289 ms 

beansdb
368.748903275 ms
326.793909073 ms
337.444067001 ms
322.673082352 ms
336.313009262 ms
331.909179688 ms
329.982995987 ms
275.442838669 ms
271.515130997 ms
333.788871765 ms

基于BufferedRandomAccess
127ms 
125ms 
125ms 
123ms 
127ms 
126ms 
125ms 
128ms 
127ms 
126ms 

 

分享到:
评论

相关推荐

    JAVA实现远程文件读取

    JAVA是一种广泛应用于软件开发的编程语言,随着网络技术的发展,JAVA也提供了许多支持远程文件读取的功能,本文将详细介绍JAVA实现远程文件读取的知识点。 1. Socket 编程 在JAVA中,Socket是最基本的网络编程接口...

    JAVA Socket远程执行任务

    Java Socket远程执行任务是一种通过网络通信来实现远程控制或数据传输的技术。在这个示例中,客户端与服务器端通过Socket进行交互,客户端发送特定的命令和一个包含可执行代码的jar包,服务器端接收到这些数据后,...

    JAVA Socket 经典教程

    通过学习Java Socket编程,开发者可以构建功能丰富的网络应用程序,如FTP服务器、邮件系统、实时通信软件等。实践是检验理论的最好方式,动手编写Socket程序,不断尝试和调试,将有助于深化理解和提升技能。

    Java远程批量文件生成

    在Java编程领域,远程文件操作是一项重要的功能,特别是在分布式系统和云计算环境中。"Java远程批量文件生成"这个项目就是利用Java的IO(输入/输出)功能来实现在远程服务器上创建多个文件的功能。下面我们将详细...

    Java socket编程实现两台主机间的通信

    3.远程教育:使用 Java Socket 编程可以实现远程教育中的实时通信和数据传输。 四、Java Socket 编程的优点 Java Socket 编程有许多优点,例如: 1. 可靠性高:Java Socket 编程基于 TCP/IP 协议,提供了可靠的...

    Java Socket传输文件

    在这个场景中,我们利用Java的Socket API来实现在客户端(Client)和服务器端(Server)之间传输文件的功能。无论文件的大小是KB、MB还是GB,都可以通过这种方式进行安全、可靠的数据传输。 首先,让我们了解一下...

    java socket传输demo

    在实际应用中,Java Socket编程可以用于实现聊天应用、文件传输、远程控制等多种功能。为了增强安全性,可以使用SSL/TLS套接字(`SSLSocket`和`SSLServerSocket`)来提供加密的通信。同时,考虑到多线程或多进程的...

    java Socket心跳事例

    Java Socket 是一种网络通信协议,它允许两台计算机(或者运行在计算机上的程序)通过Internet进行双向通信。在这个“java Socket心跳事例”中,我们将会深入探讨如何使用Java的Socket编程来实现心跳机制,这是一种...

    java Sokcet远程调用shell

    Java Socket远程调用Shell是一种通过Java程序利用Socket通信协议实现对远程服务器的Shell命令执行的技术。这种方式常用于系统管理、自动化运维或者分布式系统的组件交互。下面将详细介绍这一技术的实现原理、步骤...

    java局域网远程下载文件

    本知识点将深入探讨如何使用Java实现这一功能,包括理解网络编程基础、使用Socket通信以及处理文件I/O。 首先,我们需要理解网络编程的基本概念。在局域网中,计算机通过IP地址和端口号进行通信。IP地址标识了网络...

    android socket实现远程文件管理(添加、删除、断点下载)

    本项目通过使用TCP/IP协议和Socket编程,构建了一个Android客户端与Java服务器端的通信系统,实现了文件的添加、删除以及断点续传功能。以下是关于这个项目的关键知识点: 1. **TCP/IP协议**:TCP(传输控制协议)...

    一个简单的java socket程序

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信的途径。在这个"一个简单的java socket程序"中,我们将会探讨如何构建一个基础的服务器端(Server)和客户端(Client)模型,这对于初学者来说...

    java socket 实现SMTP协议 发送邮件.docx

    Java Socket 是 Java 语言中用于实现网络编程的 API,通过 Socket,可以实现与远程服务器的通信。在这里,我们将使用 Java Socket 实现 SMTP 协议来发送邮件。 SMTP 协议简介 SMTP(Simple Mail Transfer Protocol...

    java使用Socket类接收和发送数据

    `Socket`类还提供了其他方法,如`getLocalAddress()`和`getRemoteSocketAddress()`,用于获取本地和远程的网络地址信息,`setSoTimeout(int timeout)`设置读取或写入操作的超时时间。 总的来说,Java的Socket类是...

    java socket 网络五子棋

    Java Socket网络五子棋是一款基于Java编程语言,利用Socket通信技术实现的在线对战游戏。在这款游戏中,玩家可以通过互联网进行实时的五子棋对决,享受远程竞技的乐趣。本项目的核心在于Socket编程,它允许两个远程...

    用java实现远程文件传输

    在Java编程环境中,实现远程文件传输是一项常见的任务,特别是在分布式系统和网络应用中。这个小程序可能涉及到了几个关键的Java技术点,包括网络编程、I/O流处理以及可能的多线程技术。以下是对这些知识点的详细...

    java读取dlt645所需文件

    在Java编程环境中,读取DLT645协议文件通常涉及到智能电表通讯,这是一个用于电力系统中远程抄表的标准。DLT645是一种基于串行通信的协议,允许设备(如电表)与主站系统进行数据交换。为了在Java中实现对这种文件的...

    java socket client-server

    总之,Java Socket编程是构建网络应用程序的关键技术,它使得两个远程程序能够相互通信。了解并掌握如何创建和管理Socket连接,以及如何有效地传输数据,对于任何希望涉足网络编程的Java开发者来说都是至关重要的。

    Java实现远程桌面(参赛作品)

    在IT领域,远程桌面连接是一种...总的来说,"Java实现远程桌面"项目涵盖了Java编程、网络通信、图像处理、多线程、输入/输出流、安全性和性能优化等多个IT领域的关键知识点,展示了Java在构建复杂系统中的强大能力。

Global site tag (gtag.js) - Google Analytics