Java 经典实例摘记 高级部分(博而不精)

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得到输入输出流,从而实现与调用的外部程序交互的目的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值