- 浏览: 581047 次
文章分类
最新评论
-
wjwjwjwj:
void T0_Work() //T0定时器调用的工作函数 ...
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发) -
xouou_53320:
lastSeries 写道前辈,是不是在工作以后连System ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
lastSeries:
前辈,是不是在工作以后连System.out.println( ...
java学习笔记:TCP通讯,传送任意文件(服务端并发) -
xouou_53320:
chuanwang66 写道不过改了iconv.exe路径也不 ...
Source Insight 中文乱码,用iconv转码,解决中文乱码问题_20150930更新 -
anazel:
正在学习,多谢分享
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连发)
/* TCP通讯 需求:传送任意文件 tcp传输要定义2个端点,客户端和服务端 步骤 1.定义服务, 服务器ip和接收端口 2.读取客户端已有的图片文件 3.使用socket输出流将数据发给服务端 4.读取服务端的反馈信息 5.关闭资源 注意: 1.在while循环中的read方法最后读到文件结束标记-1后循环退出了 而没有将该标记写入socket流中,那么服务端接收到的数据是不完整的,而且停不下来 用shutdownOutput方法告诉服务端文件到了末尾结束发送了 [示例]:传送任意文件 (客户端) */ import java.net.*; import java.io.*; class Demo { public static void main(String[] args) throws Exception { new FileClient("c:\\FoxitReader_CHS.rar"); //启动客户端,准备发送指定文件 } } class FileClient //客户端 { FileClient(String fileStr) throws Exception { s.op("客户端启动...."); File file = new File(fileStr); //关联一个文件c:\\FoxitReader_CHS.rar if(file.isFile()) //是一个标准文件吗? { client(file); //启动连接 } else { s.op("要发送的文件 "+fileStr+" 不是一个标准文件,请正确指定"); } } public void client(File file)throws Exception { Socket sock= new Socket("192.168.1.3",10007); //指定服务端地址和端口 FileInputStream fis = new FileInputStream(file); //读取本地文件 OutputStream sockOut = sock.getOutputStream(); //定义socket输出流 //先发送文件名.让服务端知道 String fileName = file.getName(); s.op("待发送文件:"+fileName); sockOut.write(fileName.getBytes()); String serverInfo= servInfoBack(sock); //反馈的信息:服务端是否获取文件名并创建文件成功 if(serverInfo.equals("FileSendNow")) //服务端说已经准备接收文件,发吧 { byte[] bufFile= new byte[1024]; int len=0; while(true) { len=fis.read(bufFile); if(len!=-1) { sockOut.write(bufFile,0,len); //将从硬盘上读取的字节数据写入socket输出流 } else { break; } } } else { s.op("服务端返回信息:"+serverInfo); } sock.shutdownOutput(); //必须的,要告诉服务端该文件的数据已写完 s.op("服务端最后一个返回信息:"+servInfoBack(sock));//显示服务端最后返回的信息 fis.close(); sock.close(); } public String servInfoBack(Socket sock) throws Exception //读取服务端的反馈信息 { InputStream sockIn = sock.getInputStream(); //定义socket输入流 byte[] bufIn =new byte[1024]; int lenIn=sockIn.read(bufIn); //将服务端返回的信息写入bufIn字节缓冲区 String info=new String(bufIn,0,lenIn); return info; } } class s { public static void op(Object obj) //打印 { System.out.println(obj); } }
/* 服务端原先有很大的局限性 原先我们没有考虑客户端的文件名,和客户端判断是否有重名文件,我们是另外指定了文件名和路径 当客户端A连接服务端,被服务端获取到后,服务端执行具体流程, 这时如果B客户端尝试连接服务端,但只能等待 因为服务端还没有处理完A客户端的请求,不能回while起始位置执行accept方法,所以 暂时获取不到B客户端对象,那么为了可以让多个客户端同时被服务端并发接收, 那么服务端最好就是将每个客户端封装到一个个单独的线程中,这样,就可以同时处理多个客户端请求 如何定义线程呢? 只要明确每一个客户端要再服务端执行的代码即可,将该代码放到run方法中 如果服务端存在同名文件就返回信息并断开该次连接 如果要让客户端选择是否要覆盖文件,可以再加个反馈操作应该就可以了 [示例]:传送任意文件 (服务端并发执行) */ import java.net.*; import java.io.*; class Demo { public static void main(String[] args) throws Exception { new FileServer(); //启动文件存储服务端 } } class FileServer //服务端 { FileServer() throws Exception { s.op("服务端启动......"); server(); } public void server() throws Exception { ServerSocket serversock = new ServerSocket(10007); //监听端口 while(true) { Socket sock = serversock.accept(); //循环等待客户端连接 new Thread(new FileServThread(sock)).start(); //当成功连接客户端后开启新线程接收文件 } } } class FileServThread implements Runnable //服务端线程 { private Socket sock; FileServThread(Socket sock) { this.sock = sock; } public void run() { String ip = sock.getInetAddress().getHostAddress(); //获取客户端ip try { s.op("开启新线程接收来自客户端IP: "+ip+" 的文件"); InputStream sockIn= sock.getInputStream();//定义socket输入流,接收客户端的信息 File file =getClientFileName(sockIn); //创建同名文件 if(file==null) { writeOutInfo(sock,"存在同名文件或获取文件失败,服务端断开连接!"); sock.close(); return; } FileOutputStream fos= new FileOutputStream(file); //用来写入硬盘 byte[] bufFile = new byte[1024*1024]; //接收数据的缓存 int len=0; while(true) { len=sockIn.read(bufFile); //接收数据 if(len!=-1) { fos.write(bufFile,0,len); //写入硬盘文件 } else { break; } } writeOutInfo(sock,"上传成功!"); //文件接收成功后给客户端反馈一个信息 s.op("文件接收成功!"+System.getProperty("line.separator")); //服务端打印一下 fos.close(); sock.close(); } catch(Exception ex) { throw new RuntimeException(ip+"异常!!!"); } } public void writeOutInfo(Socket sock,String infoStr)throws Exception//将信息反馈给服务端 { OutputStream sockOut = sock.getOutputStream(); sockOut.write(infoStr.getBytes()); } public File getClientFileName(InputStream sockIn) throws Exception //获取文件名并创建 { //获取客户端请求发送的文件名,并判断在D盘创建同名文件的情况 byte[] bufName=new byte[1024]; int lenInfo =0; lenInfo = sockIn.read(bufName); //获取文件名 String fileName = new String(bufName,0,lenInfo); File dir = new File("d:\\"); //存到D盘根目录 File[] files=dir.listFiles(); //遍历d盘目录 for(File f:files) { if(!f.isDirectory()) //如果遍历到的该文件不是一个目录的话 { if(f.getName().equals(fileName)) //判断是否是同名文件 { s.op(f.getName()+"文件已存在,断开该ip连接."+System.getProperty("line.separator")); writeOutInfo(sock,"服务端已存在同名文件!"); //反馈给客户端的信息 return null; } } } s.op("将客户端发来的文件( "+fileName+" )存到"+dir.getAbsolutePath()); File file= new File(dir+fileName); if(file.createNewFile()) { s.op("成功创建文件("+fileName+" )准备写入数据"); writeOutInfo(sock,"FileSendNow"); //告诉客户端,开始传送数据吧 return file; } else { return null; //如果由于硬盘满了等原因创建文件失败的话 } } } class s { public static void op(Object obj) //打印 { System.out.println(obj); } }
评论
2 楼
xouou_53320
2015-12-17
lastSeries 写道
前辈,是不是在工作以后连System.out.println()这样的函数也得用一个类封装呀,是不是得从现在就养成这样的习惯
其实是我比较懒
1 楼
lastSeries
2015-11-23
前辈,是不是在工作以后连System.out.println()这样的函数也得用一个类封装呀,是不是得从现在就养成这样的习惯
发表评论
-
java学习笔记:内部类实现单链表
2012-02-18 10:12 2370/* 第一个节点称 ... -
java学习笔记:龙抓手之抓取网页中的邮件地址
2012-02-12 23:08 1167/* 正则表达式 [示例]: ... -
java学习笔记:模拟浏览器,访问网址
2012-02-04 19:05 4708/* 使用UI界面,输入 ... -
java学习笔记:装箱和拆箱,包装器和缓冲池
2012-01-31 13:52 3629jdk1.5以后用Integer举例Integer a = 3 ... -
java学习笔记:TCP通讯应用,传送文本文件
2012-01-29 13:28 1929/* TCP通讯 [示例]:传送文本文件 ... -
java学习笔记:TCP通信应用,字符大写转换服务器
2012-01-28 18:30 2110先启动服务端 再启动客户端,并输入字符 Student ... -
java学习笔记: 实现简易局域网聊天程序
2012-01-18 19:50 2417/* 使用UDP模式,编写一个聊天程序 有发送和接收 ... -
java学习笔记:字符的编码与解码练习
2012-01-08 22:06 1717编码:字符串转成字符数组 解码:字节数组转成字符串 ... -
java学习笔记:常见字符编码和编码头BOM
2012-01-07 23:24 6380ANSI(American National Standa ... -
java类初始化过程
2012-01-03 21:53 2491/* 测试3个内容: 类加载顺序 子父类执行 ... -
java学习笔记:管道流PipedInputStream和PipedOutputStream
2012-01-03 13:39 14619/* 管道流: PipedInputStr ... -
java学习笔记:文件的分割合并
2012-01-02 20:40 1410/* 分割合并小文件 在c盘先手动粘贴一个jpg ... -
元旦恶搞:模仿360和QQ大战(献给2011网络流行新词榜!)
2011-12-30 20:45 1522元旦即将来临,谨以此文献给2011网络流行新词榜... 榜首 ... -
java学习笔记:File类的listFiles方法,及使用匿名内部类和递归调用
2011-12-27 21:21 137921.File类的带参数的list方法的使用 2.复习使用匿名 ... -
java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter
2011-12-24 09:43 118361 字节流InputStream ... -
java自动编译批处理
2011-11-26 11:29 2024最近开始学习java 教程中用的是dos命令行环境, 每次 ...
相关推荐
Java项目学习笔记: SSM实战项目——Java高并发秒杀API,详细流程+学习笔记
Java学习笔记:JavaSe、Spring、JVM、MySQL、MyBatis...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...
毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于spring+mybatis实现高并发秒杀系统,包含详细笔记 毕设项目:基于...
Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
java学习笔记,java基础知识,只用于个人学习。
java鬼混笔记:JAVA发邮箱(带附件)
(完整版)最全的java学习笔记(必看).pdf
Java容器学习笔记: 容器概览, 容器中的设计模式, 容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
Java JDK 5.0学习笔记:TP312JA L393.iso 随书光盘,欢迎大家下载 大家共享^A^
java学习笔记.doc java学习笔记 java学习 学习笔记 java
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
Java Swing组件:Jlist学习笔记Java Swing组件:Jlist学习笔记
JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记
Java学习笔记(必看经典) Java学习笔记(必看经典) Java学习笔记(必看经典)
java学习笔记java学习笔记java学java学习笔记习笔记
在学习java过程中的笔记。