反射API介绍
4.Java Socket编程 TCP 协议编程
1) TCP工作模型: 先找
堂(主机/IP), 到食堂以后找窗口
(Socket/套接字 端口号), 服务员等待连接,客户向服务员发起连接
连接以后, 一个窗口可以为每个客户安排一个服务员(线程)提供服务,
每个服务过程可以双向交流通讯(流), 通讯完成后要关闭连接.
5. TCP 服务端编程(食堂)(java.io.*,java.net.*,java.lang.*)
1) 创建ServerSocket实例绑定一个服务端口(Socket/套接字 端口号)
2) 开始ServerSocket实例 的监听, 等待客户端的连接
3) 如果有客户连接进来, 就获得了客户的套接字(Socket)实例
客户的套接字(Socket)实例中包括与客户端建立的连接流
4) 为这个客户(Socket) 创建一个服务线程, 提供服务(run方法)
5) 继续等待下一个连接, 返回到2)
6) 服务线程 完成通讯服务过程
7) 端口号: 0~65535, 1K以下留给系统使用
6. TCP 客户端编程
1) 创建Socket 实例, 连接到服务器端, 成功创建s就表示连接到了
服务器
Socket s = new Socket("host", port)
2) 客户端 Socket 与服务器端 Socket 对应, 都包含输入, 输出流
客户端的s.getInputStream() 连接于服务器s.getOutputStream()
客户端的s.getOutputStream()连接于服务器s.getInputStream()
3) 使用线程处理 网络流
7. Java 反射
1) 反射是Java自我管理(类, 对象)的机制
2) * 可以通过反射机制发现对象的类型 发现类型的方法/属性/构造器
3) * Java 反射 可以创建对象 并 访问任意对象方法和属性等
4) Class 加载
类加载到内存: java 将磁盘类文件加载到内存中,为一个对象(实例)
这个对象是Class的实例, 也就是 这些对象都是Class实例
5)Class 实例代表Java中类型, 基本类型的类型: int.class, long.class
类类型 Class 实例获得如下:
Class cls = String.class
Class cls = Class.forName("java.lang.String")
Class cls = "abc".getClass()
以上方法获得cls 是同一个对象, 就是String 类内存加载的结果
package javase2.day06.ftpimport java.io.BufferedOutputStreamimport java.io.Fileimport java.io.FileOutputStreamimport java.io.IOExceptionimport java.io.InputStreamimport java.io.OutputStreamimport java.net.Socketimport java.util.Scanner/** * ftp 客户端 可以使用命令 ls pwd get */public class FtpClient { public static void main(String[] args) throws IOException{FtpClient client = new FtpClient() client.open() } public void open() throws IOException{Socket s = new Socket("localhost", 9000) InputStream in = s.getInputStream() OutputStream out = s.getOutputStream() //处理客户端对服务器的请求new RequestProcess(out).start() //处理服务器的反馈信息new ResponseProcess(in).start() }//处理客户端对服务器的请求 class RequestProcess extends Thread{OutputStream out public RequestProcess(OutputStream out) { this.out = out }public void run() { try{Scanner sc = new Scanner(System.in) while(true){ String s = sc.nextLine() IOUtils.println(out, s) if(s.equals("bye")){System.exit(0) }} }catch(IOException e){e.printStackTrace() }} } class ResponseProcess extends Thread{InputStream in public ResponseProcess(InputStream in) { this.in = in }public void run() { try{while(true){ String header = IOUtils.readLine(in) if(header.startsWith("text,")){show(header,in) }else if(header.startsWith("file,")){save(header, in) }} }catch(IOException e){e.printStackTrace() }} } public void show(String header, InputStream in) throws IOException {int n = Integer.parseInt(header.split(",")[1]) for(int i=0i<ni++){ String s = IOUtils.readLine(in) System.out.println(s) } } public void save(String header, InputStream in) throws IOException{File dir = new File("ftp") if(!dir.exists()){ dir.mkdir() }//header: file,10,filenameString[] data = header.split(",") long length = Long.parseLong(data[1]) String filename = data[2] File file = new File(dir, filename) BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(file)) for(long i=0i<lengthi++){ int b = in.read() out.write(b) }out.close() }}-----------------------------------package javase2.day06.ftpimport java.io.Fileimport java.io.FileInputStreamimport java.io.IOExceptionimport java.io.InputStreamimport java.io.OutputStreamimport java.net.ServerSocketimport java.net.Socket/** * 模拟FTP服务器, 支持命令pwd,ls,get file * * 协议: type,length,value TLV格式 * * 文本: text,5\nline1\nline2\nline3\nline4\nline5\n * 文件: file,4,filename\n 41 42 43 44 ** text,5\nline1\nline2\nline3\nline4\nline5\nfile,4,filename\n 41 42 43 44 */public class FtpServer { public static void main(String[] args)throws IOException{FtpServer server = new FtpServer() server.start() }public void start() throws IOException{ServerSocket ss = new ServerSocket(9000) while(true){ Socket s = ss.accept() new Agent(s).start() } } class Agent extends Thread{Socket s public Agent(Socket s) { this.s = s }public void run() { try{InputStream in = s.getInputStream() OutputStream out = s.getOutputStream() //向客户端发送, 先发协议头,再发送文本行out.write("text,1\n".getBytes())//协议头//发送消息内容, 一行文本消息out.write("欢迎使用FTP演示服务器!\n".getBytes()) out.flush() while(true){ //读取客户端发送到命令 String cmd = IOUtils.readLine(in).trim() if("pwd".equals(cmd)){//显示当前目录pwd(out) }else if("ls".equals(cmd)){ls(out) }else if(cmd.startsWith("get ")){get(cmd, out) }else if("bye".equalsIgnoreCase(cmd)){IOUtils.println(out, "text,1") IOUtils.println(out, "Bye, Bye!") s.close() }else{out.write("text,1\n".getBytes())//协议头out.write("只支持pwd,ls,get,bye!\n".getBytes()) out.flush() }} }catch(IOException e){e.printStackTrace() }} } public void pwd(OutputStream out) throws IOException{File dir = new File(".") IOUtils.println(out, "text,1") IOUtils.println(out, dir.getCanonicalPath()) } public void ls(OutputStream out)throws IOException{File dir = new File(".") File[] files = dir.listFiles() IOUtils.println(out, "text,"+files.length) for (File f : files) { if(f.isDirectory()){IOUtils.println(out, "["+f.getName()+"]") }else{IOUtils.println(out, f.getName()) }} } public void get(String cmd, OutputStream out)throws IOException{//cmd="get filename"String name = cmd.split("\\s+")[1] File file = new File(name) if(! file.exists()){ IOUtils.println(out, "text,1") IOUtils.println(out, "没有文件呀!"+name) return }//文件协议头: IOUtils.println(out, "file,"+file.length()+","+name) FileInputStream in = new FileInputStream(file) IOUtils.cp(in, out) out.flush() in.close() IOUtils.println(out, "text,1") IOUtils.println(out, "发送成功:"+name) }}
这个是wps自己系统的错误,等会再从新打开,如果还是不行可以先卸载掉,再从新装,或者直接就不用了。我自己用的wps到别人电脑上我的文档就打不开了,如果换成是Excel 2007就可以了欢迎分享,转载请注明来源:夏雨云
评论列表(0条)