用scala实现一个基于TCP Socket的快速文件传输程序
2024-10-19 02:29:24
这是用scala实现的一个简单的文件传输程序。
服务端
package jpush import java.io.{DataInputStream, File, FileOutputStream} import java.net.ServerSocket import scala.collection.JavaConversions._ /** * Created by dingb on 2016/6/3. */ object Server extends App { def port = 8899 override def main(args: Array[String]) { val roots = args.toList match { case Nil => List(new File(System.getProperty("user.dir"))) case _ => args.map(new File(_)).toList } printf("dst root is %s\n", roots.mkString(",")) val ss = new ServerSocket(port) def accept: Unit = { val s = ss.accept() printf("%s in \n", s.getRemoteSocketAddress); async { val dis = new DataInputStream(s.getInputStream) val fn = dis.readUTF val size = dis.readLong printf("loading %s %d\n", fn, size); if(size > 0) { roots.foreach(new File(_, fn).getParentFile.mkdirs()) val oses = roots.map(new File(_, fn)).map(new FileOutputStream(_)) val buf = new Array[Byte](1024) var done = false while(!done) { val r = dis.read(buf) if(r <= 0) done = true else oses.foreach(_.write(buf, 0, r)) } oses.foreach(_.close) } } accept } accept } def async(body : => Unit) = { val t = new Thread(new Runnable { override def run(): Unit = { body } }) t.start() } }
客户端
package jpush import java.io.{DataOutputStream, File, FileInputStream} import java.net.Socket /** * Created by dingb on 2016/6/3. */ object Client extends App{ def send_file(ip: String, file: File, top: String): Unit = { val fis = new FileInputStream(file) val s = new Socket(ip, Server.port) val dos = new DataOutputStream(s.getOutputStream) val remotename = top + File.separator + file.getName printf("sending %d bytes %s to %s\n", file.length(), file.getAbsolutePath, remotename) dos.writeUTF(remotename) dos.writeLong(file.length()) val buf = new Array[Byte](1024) var done = false while(!done) { val r = fis.read(buf) if(r <= 0) done = true else dos.write(buf, 0, r) } dos.close() fis.close() s.close() } def send(ip: String, file: File, top: String): Unit = { if(file.isDirectory) file.listFiles().foreach(send(ip, _, "" + File.separator + file.getName)) else send_file(ip, file, top) } override def main(args: Array[String]) { if(args.length < 1) usage() else args.drop(1).map(new File(_)).foreach(send(args(0), _, "")) } def usage(): Unit = { println("usage: jpsh.Client <ip> [file]...") System.exit(-1) } }
源代码下载
https://github.com/dingbig/jpush
最新文章
- 多个Img标签之间的间隙处理方法
- spider RPC过滤器
- 解决vue与传统jquery插件冲突
- ansible的SSH连接问题
- /proc/net/tcp中各项参数说明
- [Mindjet MindManager]思维导图的快捷键操作
- kali 2.0源更新
- HDU1892二维树状数组
- bzoj1146整体二分+树链剖分+树状数组
- 实体框架 (EF) 入门 =>; 三、CodeFirst 支持的完整特性列表
- 编译个性化的openwrt固件
- 学点css之经验总结篇章
- HIBERNATE 01
- asp.net + Jquery 实现类似Gridview功能 (一)
- Z - 不容易系列之(3)―― LELE的RPG难题
- linux 用户空间获得纳秒级时间ns
- Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题
- 全面了解Android热修复技术
- 很全的atom问题解决方案
- 从此使用linux系统,但是QQ是必不可少的!!该篇文章方法成功!!!已验证!!!!!
热门文章
- 主机windwo7+虚拟机centos如何配置虚拟机可以上网,且与主机互ping通
- Android AudioPolicyService和AudioPolicyManager
- AXIS-web.xml里配置axis报错addChild: Child name &#39;AxisServlet&#39; is not unique 解决办法
- js中将 整数转成字符,,将unicode 编码后的字符还原出来的方法。
- win7 64位andriod开发环境搭建
- ASP.NET WebService
- JavaScript中call,apply,bind方法的总结
- Codeforces Round #364 (Div. 2) E. Connecting Universities (DFS)
- JAVA基础--super关键字
- 定时且周期性的任务研究I--Timer