- 浏览: 350295 次
- 性别:
- 来自: 南宁
文章分类
最新评论
-
萌蜗牛:
我也用华为smproxy包发送短信,运行一会儿后总是间隔一段时 ...
半桶水开发 CMPP2.0 with Spring + JPA 2 -
萌蜗牛:
我也用华为smproxy包发送短信,运行一会儿后总是间隔一段时 ...
半桶水开发 CMPP2.0 with Spring + JPA 1 -
萌蜗牛:
我也用华为smproxy包发送短信,运行一会儿后总是间隔一段时 ...
半桶水开发 CMPP2.0 with Spring + JPA 3 -
sw970345363:
[b][/b]
jqGrid 表格demo -
二年级chuck:
哪里有Java的验证。
reCAPTCHA 学习
试一下JDK5的多线程编程,附件是代码,下载后改一下后缀名为.tgz
测试环境
OSX 10.5.6
JDK6
JUnit4.5
参考
Java基于Socket文件传输示例
Java5 多线程实践
Test 图
Server 接口
客户端接口
服务器进程
文件传输线程
客户端实现
客户端接收文件线程
客户端测试类
测试环境
OSX 10.5.6
JDK6
JUnit4.5
参考
Java基于Socket文件传输示例
Java5 多线程实践
Test 图
Server 接口
/** * * @author rikugun */ public interface Server { /* * 启动服务器 */ public void startup(); /* * 停止服务器 */ public void stop(); /* * 判断服务器是否正在运行 * @return boolean 返回服务器是否正在运行 */ public boolean isRunning(); }
客户端接口
/** * * @author rikugun */ public interface Client { /* * 批量获取文件 * @param String[] 文件名 * @return boolean 成功获取返回true */ public boolean getFiles(String[] file_names); /* * 获取单个文件 * @param String 文件名 * @return boolean 成功获取返回true */ public boolean getFile(String file_name); }
服务器进程
/** * 服务器进程 * @author rikugun */ public class ServerImpl implements Server,Runnable { private static int PORT = 1213; private static int MAX_POOL = 10; private ServerSocket serverListen; private ExecutorService pool; private Properties prop; private boolean running = false; public boolean isRunning() { return running; } public ServerImpl(Properties prop) { this.prop = prop; PORT = Integer.parseInt(prop.getProperty("server.port")); MAX_POOL = Integer.parseInt(prop.getProperty("server.max_pool")); pool = Executors.newFixedThreadPool(MAX_POOL); } public void startup() { try { serverListen = new ServerSocket(PORT); serverListen.setReuseAddress(true); running = !serverListen.isClosed(); while (running) { //获取一个连接后启动一个处理线程 pool.execute(new ServerThread(serverListen.accept(), prop)); System.out.println("Get a client"); } } catch (IOException ex) { Logger.getLogger(ServerImpl.class.getName()).log(Level.SEVERE, null, ex); } } public void stop(){ if(serverListen!=null){ try { serverListen.close(); running = serverListen.isClosed(); pool.shutdown(); } catch (IOException ex) { Logger.getLogger(ServerImpl.class.getName()).log(Level.SEVERE, null, ex); } } } public void run() { startup(); } }
文件传输线程
/** * 传输文件的线程 * @author rikugun */ public class ServerThread implements Runnable { private Properties prop; private static String dir_name = "files/"; private Socket sock; private DataOutputStream dos; private DataInputStream dis; private static int buf_size = 8192; private static Logger logger = Logger.getLogger(ServerThread.class.getName()); public ServerThread(Socket sock, Properties prop) { this.sock = sock; this.prop = prop; dir_name = prop.getProperty("server.file_path"); buf_size = Integer.parseInt(prop.getProperty("server.buf_size")); } @Override public void run() { try { dos = new DataOutputStream(sock.getOutputStream()); dis = new DataInputStream(sock.getInputStream()); //获取文件名 String file_name = dis.readUTF(); if (file_name != null) { dos.writeBoolean(true); logger.log(Level.INFO, "Get the filename:[" + file_name + "],Start to Send file!"); DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(dir_name +File.separator+ file_name))); byte[] buf = new byte[buf_size]; while (true) { int read = 0; read = fis.read(buf); if (read == -1) { break; } dos.write(buf,0,read); } dos.flush(); fis.close(); logger.log(Level.INFO, "Success Send file:[" + dir_name + file_name + "]"); } else { logger.log(Level.INFO, "No such file named:[" + file_name + "] in [" + dir_name + "]"); dos.writeBoolean(false); dos.writeUTF("No such file named:[" + file_name + "] in [" + dir_name + "]"); } } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } finally { try { dos.close(); } catch (IOException ex) { Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); } } } }
客户端实现
/** * * @author rikugun */ public class ClientImpl implements Client { private Properties prop ; private ExecutorService pool; public ClientImpl(Properties prop) { this.prop = prop; pool = Executors.newFixedThreadPool(Integer.parseInt(prop.getProperty("client.max_pool"))); } /* * @see csdemo.client.Clinet */ public boolean getFiles(String[] file_names) { boolean success = true; for (String string : file_names) { success = success && getFile(string); } return success; } /* * @see csdemo.client.Clinet */ public boolean getFile(String file_name) { boolean success = false; try { Socket sock = new Socket(prop.getProperty("server.ip"), Integer.parseInt(prop.getProperty("server.port"))); if(sock.isConnected())System.out.println("Connect to Server"); //加载处理线程 pool.execute(new ClientThread(sock, file_name, prop)); success = true; } catch (UnknownHostException ex) { Logger.getLogger(ClientImpl.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(ClientImpl.class.getName()).log(Level.SEVERE, null, ex); } return success; } }
客户端接收文件线程
/** * * @author rikugun */ public class ClientThread implements Runnable { private Socket sock; private String file_name; private DataInputStream dis; private DataOutputStream fos, dos; private Properties prop; public ClientThread(Socket sock, String file_name, Properties prop) { this.sock = sock; this.file_name = file_name; this.prop = prop; } public void run() { try { dos = new DataOutputStream(sock.getOutputStream()); dis = new DataInputStream(new BufferedInputStream(sock.getInputStream())); //告知服务器需要获取的文件名 dos.writeUTF(file_name); byte[] buf = new byte[Integer.parseInt(prop.getProperty("server.buf_size"))]; if (dis.readBoolean()) { int read = 0; fos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(prop.getProperty("client.file_path") + File.separator + file_name))); while (true) { read = dis.read(buf); if (read == -1) { break; } fos.write(buf,0,read); } fos.flush(); fos.close(); System.out.println("Success write the response to " + file_name); } else { System.out.println("Get file Failed! " + dis.readUTF()); } } catch (IOException ex) { Logger.getLogger(ClientThread.class.getName()).log(Level.SEVERE, null, ex); } finally { try { dis.close(); sock.close(); } catch (IOException ex) { Logger.getLogger(ClientThread.class.getName()).log(Level.SEVERE, null, ex); } } } }
客户端测试类
/** * * @author rikugun */ public class ClientTest { static Properties prop = new Properties(); static ServerImpl server; Client instance; public ClientTest() { } @BeforeClass public static void setUpClass() throws Exception { FileInputStream fis = new FileInputStream("conf.properties"); prop.load(fis); System.out.println("Load prop success!"); server = new ServerImpl(prop); // server.startup(); new Thread(server).start(); if (server.isRunning()) { System.out.println("Server is running..."); }else{ System.out.println("Server start failed!"); } } @AfterClass public static void tearDownClass() throws Exception { server.stop(); } @Before public void setUp() { instance = (Client) new ClientImpl(prop); } @After public void tearDown() { } /** * Test of getFiles method, of class Client. */ @Test public void testGetFiles() { System.out.println("getFiles"); String[] file_names = new String[]{"2.txt", "3.txt", "4.txt", "5.txt"}; boolean expResult = true; boolean result = instance.getFiles(file_names); assertEquals(expResult, result); } /** * Test of getFile method, of class Client. */ @Test public void testGetFile() { System.out.println("getFile"); String file_name = "1.txt"; boolean expResult = true; boolean result = instance.getFile(file_name); assertEquals(expResult, result); } }
发表评论
-
weblogic8 控制台 启用和关闭
2012-08-06 14:04 1880因为安全审查的原因,需要临时修改weblogic ,关闭 we ... -
Eclipse 整合 Mylyn Trac
2011-11-04 15:06 1885<!--?xml version="1.0&q ... -
Tuxedo 调用EJB 报错问题
2011-08-01 15:32 2350新做了个tuxedo系统, 需要调用到EJB交易 测试时报错 ... -
Weblogic8 @aix socket达上限 报错
2011-07-29 14:34 1634今天发现有台weblogic应用链接不上了,检查日志发现如下信 ... -
AIX 下安装 memcached
2011-04-01 10:48 4651生产环境需要部署memcached 简单列下安装流程 操作系 ... -
OSX SnowLeopard 下的JRE1.4
2009-12-02 14:14 2037上一次更新SL的时候没有注意Java1.4会被去掉. 重新装了 ... -
封装一个jqGrid的数据源类
2009-07-07 21:11 5713这2个月刚换单位,比较赶进度.很久不更新blog,今天抽空看了 ... -
List.toArray() 问题
2009-05-30 16:30 2434今天写代码的遇到这个问题,网上找了一下问题原因和解决办法,记一 ... -
DWR中文文档.pdf
2009-05-20 11:30 2166项目用到这个,传上来存一下 -
weblogic 8.1 下载地址
2009-05-11 12:56 10620oracle官网上的最低版本只找到10.3,因需要8.1 上网 ... -
jax-ws 学习笔记
2009-03-31 15:40 1391A Provider-based endpoint can ... -
卓望MISC1.6 的provision --无web服务器
2009-03-06 09:37 1771根据那个图片上传处理服务器的思路,小改了一个处理器.尚未测试. ... -
简单的JAVA HTTP server 如何解析附件
2009-03-03 16:34 2476想做一个简单的图片上传服务器,发现JDK6中有个HttpSer ... -
在NetBeans下用Swing做的计算器
2009-01-05 17:04 2621试用了Netbeans的gui设计,非常好用,拖拖拉拉就出来. ... -
半桶水开发 CMPP2.0 with Spring + JPA 3
2008-12-19 10:51 2298半桶水开发 CMPP2.0 with Spring + JP ... -
半桶水开发 CMPP2.0 with Spring + JPA 2
2008-12-18 12:08 2977半桶水开发 CMPP2.0 with Spring + JP ... -
半桶水开发 CMPP2.0 with Spring + JPA 1
2008-12-18 11:31 3238本来公司招进来的时候是做PHP,简历哪里手多写了会Ja ... -
记这辈子第一次出差
2008-11-14 21:10 1344今天因柳州电子运维系统的问题没有解决,终于被派遣过去 ...
相关推荐
本文将深入探讨一种客户端-服务器(Client-Server,简称CS)架构下的多线程文件下载实现。这种技术允许服务器同时处理多个客户端请求,提升整体系统性能。 【描述】:“转载的别人的,这个代码写的很清除,很实用,...
在QT框架下,利用TCP协议实现一个多线程的文件互传系统是一项常见的任务,它涉及到网络编程、多线程处理以及文件操作等多个方面。本文将深入探讨这些关键知识点。 首先,TCP(Transmission Control Protocol)是一...
在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC)开发一个多线程的同步聊天及文件传输应用。这个项目结合了网络编程、多线程技术和文件操作,旨在实现客户端和服务端之间的实时通信和文件交换。 ...
总的来说,"多线程传输文件 断点传输大文件"这个项目通过多线程技术提高了文件传输的速度,通过互斥锁确保了数据一致性,通过共享内存实现了线程间的通信,而断点续传则提供了更好的用户体验。这些技术的结合运用,...
"多线程socket文件传输"是一个常见的应用场景,特别是在大数据交换、文件共享等需求中。本项目使用C语言实现了一个非阻塞的多线程socket文件传输程序,尽管可能存在一些问题,但对初学者来说,它能提供宝贵的实践...
这个“多线程下载demo”项目就是专门为了实现这一目标,它允许我们将一个大的HTTP响应内容分割成多个小文件,然后通过多个线程并行下载这些片段,最后再将它们合并成原始文件。 首先,我们要理解什么是多线程。在...
本文将深入探讨“多线程传输文件”的概念、原理以及实际应用。 多线程指的是在一个程序中同时运行多个独立的执行线程。在文件传输场景下,多线程可以并行处理不同部分的文件,从而充分利用计算机的多核处理器资源,...
在多线程下载中,每个线程都会发送一个HTTP GET请求,指定文件的一个部分(如通过Range头来指定开始和结束字节)。 在实际应用中,还需要考虑一些其他因素,如错误处理(如网络中断、服务器错误等)、断点续传...
在多线程文件传输中,通常会有一个线程负责创建和维护SOCKET连接,而其他线程则负责读取本地文件并发送到远程,或者接收远程发送的文件。 文件`InitSock.h`可能包含了初始化套接字相关的函数声明,这些函数可能包括...
此外,文件存储也是多线程下载的一个关键部分。Android提供了File、FileOutputStream等类来处理本地文件操作。通常,下载的文件会被保存到外部存储(SD卡)或者内部存储的特定目录下,确保数据的持久化。 为了协调...
在文件传输过程中,多线程可以极大地提高效率,例如,一个线程负责接收文件,另一个线程负责写入磁盘,这样可以避免单线程操作时的阻塞,提高整体传输速度。在MFC中,我们可以使用CWinThread类来创建和管理线程。 ...
1. **客户端**:创建套接字,连接到服务器,发送文件大小信息,然后启动线程传输文件块。 2. **服务器**:监听客户端连接,接收文件大小信息,创建相应数量的线程接收并保存文件块。 3. **错误处理**:在网络环境...
总之,“android文件多线程下载demo”涵盖了Android开发中的多线程编程和SQLite数据库应用两大关键知识点,对于初学者来说,这是一个很好的实践项目,可以帮助他们深入理解这两个重要概念,并将其应用于实际项目中。...
5. **I/O流**:在Java中,`InputStream`和`OutputStream`是用于读写文件的基础类,多线程传输时,每个线程可以拥有自己的输入/输出流实例,分别处理文件的一部分。 6. **异常处理**:多线程环境下,需要确保每个...
Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...
在多线程Socket文件传输中,通常会创建一个主线程负责管理连接和调度,而其他线程则分别处理文件的读写。这种方式允许并发处理多个文件传输,提高了系统的并行处理能力。对于断点续传功能,需要在客户端和服务器之间...
总之,基于WCF的多线程SOCKET文件传输服务是一个复杂而实用的系统,它结合了WCF的易用性和SOCKET的灵活性,通过多线程实现了高效的文件并发传输。在设计和实现过程中,需要注意服务的可扩展性、安全性以及性能优化,...
Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)