Java 经典实例摘记 高级部分(博而不精)
2017-02-24 15:30
281 查看
16. 网络客户端
查找网络地址(16.2)
使用InetAddresss类,该类没有公有的构造函数,通过调用静态方法get*By*,可以实现从域名得到IP地址或者从IP地址得到域名的功能。此外,这个方法实际不会访问网络,所以不会抛出和网络相关的异常(我想,这个类实际上是在访问本地的DNS缓存)
使用TCP或者UDP的服务(16.4 & 16.7)
Socket是TCP的实现,通过Socket的实例的getInputStream以及getOutputStream来双向收发信息,同时可以在这两个流的基础上封装其他流,已达到发送二进制数据,序列化发送对象的目的。对于UDP的实现,是DatagramSocket,而且还要配合DatagramPacket使用
发送UDP报文的流程是:
1. 构建一个不带参数的DatagramSocket对象(如果是服务端的话需要传入InetAddress和port两个参数)
2. (可选步骤)调用DatagramSocket的connection(InetAddress,port)方法,连接目标
3. 创建若干个DatagramPacket对象,设置数据
4. 如果没执行上述第二步,则构建DatagramPacket的时候需要设置InetAddress和port
5. 设置报文的长度
6. 调用DatagramSocket的send方法,发送Packet
7. 调用DatagramSocket的receive方法,接收数据
UDP使用实例:
/*发送端*/ final int buffeSize=10000;//定义缓冲大小 final int sendPort=8888;//定义发送端口 final int destinationPort=7777;//定义目标端口 InetAddress destinationAddress;//定义目标IP try { destinationAddress = InetAddress.getByName("localhost"); } catch (UnknownHostException e) { e.printStackTrace(); return ; } DatagramSocket socket; try { socket = new DatagramSocket(sendPort);//初始化DatagramSocket } catch (SocketException e) { e.printStackTrace(); return ; } byte [] byteArray=new byte[buffeSize]; byteArray="hello world!".getBytes(); //用byte数组填充需要发送的分组,设置目标地址和端口 DatagramPacket packet=new DatagramPacket(byteArray,buffeSize,destinationAddress,destinationPort); try {//发送分组并关闭Socket socket.send(packet); } catch (IOException e) { e.printStackTrace(); return ; }finally{ socket.close(); }
/*接收端*/ final int linstenPort=8888;//设置监听的端口 final int bufferSize=10000; byte[] byteArray=new byte[bufferSize]; DatagramSocket socket = null; DatagramPacket packet = null;//声明用于接收分组的packet try { socket=new DatagramSocket(linstenPort); } catch (SocketException e) { e.printStackTrace(); return ; } packet=new DatagramPacket(byteArray, bufferSize); try { socket.receive(packet); } catch (IOException e) { e.printStackTrace(); return ; }finally{ socket.close(); } System.out.println(new String(byteArray));
17. Java 服务器端
创建ServerSocket
ServerSocket指定端口即可,然后通过ServerSocket对象的accept方法,监听、得到一个Socket对象,通过Socket对象完成读取,发送的目的。为了应对多个请求的情况,accept之后,还可以通过新开线程来解决。
使用Java套接字扩展(JSSE)
使用SSLServiceSocketFactory类,通过静态方法getDefault可以获得一个用于加密的ServiceSocketFactory实例(如果想获得加密的Socket,可以使用SSLSocketFactory类),然后调用实例的createServiceSocket方法,即可创建加密的ServiceSocket。19. Java和Email
使用Java收发邮件
收邮件和发邮件有一些共通的基础类,首先,需要一个Properties,设置有关协议的各种配置,然后需要一个Session,用来产生一个邮件的会话。然后,如果是发邮件:
需要创建一个Message,用于设置邮件内容、标题,发送人和收件人
最后通过Session得到一个Transport,通过Transport连接邮件服务器,发送邮件。
如果是收邮件:
需要通过Session得到一个Stroe,通过Store连接邮箱服务器,检索信箱,得到新邮件。
20. 数据库访问
用ResultSet改变数据(20.9)
在创建Statement时传入参数ResultSet.CONCUR_UPDATEABLE指定ResultSet可以更新,然后通过对Result对象调用update*方法族设置更新的数据,通过方法updateRow更新。21. XML
XML简介(20.0)
XML和HTML都继承于SGML,SGML继承于GML。在Java中,对XML的解析分成两种,较为简单的,仅仅只能在遇到一些事件(元素开始,元素结束等)做出响应的SAX(Simple API for XML),以及功能完备的,在内存中构建文档树的DOM。
从对象生成XML,读取XML对象
使用XMLEncoder可以将对象以对象流的方式输出到XML中,同样,使用XMLDecoder可以将XML中序列化的对象通过流读入到内存中。如何将XML转化成其他文档格式
使用XPLT处理器,通过xls文档作为模板,可以将XML输出为其他文档格式Transformer trans=TransformerFactory.newInstance().newTransformer(new StreamSource(new File("XSL document path"))); trans.transform(new StreamSource(new File("XML path")),new StreamResult(new File("output file path")));
22. 分布式Java:RMI
创建远程调用的全过程(22.1-22.3)
首先创建需要远程调用的接口,其中声明远程调用的方法,这个接口需要实现Remote接口。然后创建实现了远程调用接口的类,这个类除了实现了(先前创建的(实现了Remote接口)接口),还需要继承UnicastRemoteObject.
最后,服务端需要注册监听端口和RMI对象,客户端可以通过注册的名字找到RMI的方法并且运行得到结果。
一个示例:
//需要远程调用的接口 public interface RemoteExample extends Remote{ //注意这里要抛出RemoteEception异常,否则会报错 public Date getDate() throws RetoteException; } //实现了接口和UnicastRemoteObject的类 public class RemoteExampleImpl extends UnicastRemoteObject implements RemoteExample{ private static final long serialVersionUID = 7097958066308584278L; //这里注意要调用父类构造器方法,RMI本质上是要建立网络连接的,构造器里会执行建立连接的步骤 protected RemoteExampleImpl() throws RemoteException { super(); } @Override public Date getDate() throws RetoteException{ return new Date(); } } //提供远程调用的一端需要执行的操作 public void serviceMethod() throws RemoteException, MalformedURLException{ RemoteExample re=new RemoteExampleImpl(); //监听端口 LocateRegistry.createRegistry(8888); //绑定对象 Naming.rebind("rmi://localhost:8888/RemoteExample", re); } //调用远程方法要执行的操作 public void clientMethod() throws MalformedURLException, RemoteException, NotBoundException{ //从远程找到对象 RemoteExample re=(RemoteExample)Naming.lookup("rmi://localhost:8888/RemoteExample"); System.out.println(re.getDate()); }
23. 包和包装机制
如何打包一个jar(23.4)
使用命令行操作JDK工具,更多信息运行在CMD运行jar命令即可查看jar cvf outputPath inputPath//outputPath结尾为jar文件,inputPath如果是当前目录,可以使用`.`代表
其中 f 表示输出到指定目录,后面接outputPath,c表示创建jar,还有 m 可以指定mainfest文件
同样的方法也可以生成war文件
26. Java与其他语言的结合
在Java中调用本机的可执行程序,并且得到返回值(26.1-26.2)
使用Runtime和Process类示例代码:
Runtime r=Runtime.getRuntime(); Process p=r.exec("other app path"); p.waitFor();//这一句将会等到程序执行结束 System.out.println(p.exitValue());//打印所调用程序的返回值
除了示例中
p.exitValue()能得到int型的返回值之外,还可以通过Process得到输入输出流,从而实现与调用的外部程序交互的目的
相关文章推荐
- Java 经典实例摘记 前5章 字符串和数字
- Java 经典实例摘记 文件相关
- Java反射经典实例 Java Reflection Cookbook
- 充分利用 Java 的元数据,第 3 部分:高级处理
- 充分利用 Java 的元数据,第 3 部分:高级处理
- Java反射经典实例
- [零基础学JAVA]Java SE面向对象部分-16.面向对象高级(04) 推荐
- JAVA多线程学习初步经典实例
- [零基础学JAVA]Java SE面向对象部分-19.面向对象高级(07) 推荐
- Java反射经典实例 Java Reflection Cookbook
- JAVA 多线程 经典实例-弹跳小球
- [零基础学JAVA]Java SE面向对象部分-17.面向对象高级(05) 推荐
- java多线程经典实例
- java经典实例
- Java反射经典实例
- 充分利用 Java 的元数据,第 3 部分:高级处理
- Java反射经典实例 Java Reflection Cookbook
- java的经典实例【1】
- java的经典实例【3】
- [零基础学JAVA]Java SE面向对象部分-14.面向对象高级(02) 推荐