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

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 CS远程监控系统软件的实现(源代码+WORD论文文档论文).zip

    本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 2.2.2 系统运行概述 1.启动被监控端,打开指定的UDP端口号。用于读取命令。 2.被监控端...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包2

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包4

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA文件传输的实现.rar

    文件流操作:使用Java的文件输入输出流(FileInputStream、FileOutputStream)读取和写入文件内容。 多线程处理:通过多线程实现并发处理多个文件传输请求,提高传输效率。 异常处理:处理网络异常、文件读写异常等...

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    基于JAVA CS远程监控系统软件的实现

    5.主控端和被监控端读取和发送数据,分别来实现文件上传和下载。 6.在被监控端实现DOS命令的执行。 系统使用的关键技术就是Java网络编程和Java图形编程。用Java网络编程实现主控端和被监控端的通讯(命令收发、...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    JAVA上百实例源码以及开源项目源代码 java开源包2

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    基于JAVA本地监听与远程端口扫描的毕业设计,通过JAVA的ServerSocket类,创建ServerSocket对象并绑定

    本设计主要实现基于JAVA的本地端口监听与远程主机端口扫描功能。本地端口监听用于监控本机某一端口是否有连接请求,远程端口扫描用于检测远程主机开放的端口情况。 本地端口监听实现通过JAVA的ServerSocket类,创建...

    Socket编程.txt

    应用程序通过创建套接字、绑定套接字到本地地址、监听网络连接、接受连接请求、读写数据等操作,实现与远程计算机的通信。 Socket编程通常使用特定的编程语言提供的库函数来实现。例如,在C语言中,可以使用BSD套接...

    基础深化和提高-网络编程

    URL和URLConnection:Java提供了java.net.URL和java.net.URLConnection等类,用于访问URL指定的资源,如网页、文件等,并进行数据的读取和写入。 HTTP客户端:Java提供了java.net.HttpURLConnection等类,用于创建...

    Java网络编程(第三版)中文版.part09.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造...

Global site tag (gtag.js) - Google Analytics