• 20145236 《Java程序设计》 第十周学习总结


    20145236 《Java程序设计》 第十周学习总结

    Java网络编程

    Java网络编程技术

    Java语言是在网络环境下诞生的,所以Java语言虽然不能说是对于网络编程的支持最好的语言,但是必须说是一种对于网络编程提供良好支持的语言,使用Java语言进行网络编程将是一件比较轻松的工作。

    和网络编程有关的基本API位于java.net包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。该包中既包含基础的网络编程类,也包含封装后的专门处理WEB相关的处理类。在本章中,将只介绍基础的网络编程类。

    首先来介绍一个基础的网络类——InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。

    • 关于该类的使用,下面通过一个基础的代码示例演示该类的使用,代码如下:
    import java.net.*;
    /**
     * 演示InetAddress类的基本使用
     */
    public class InetAddressDemo {
             public static void main(String[] args) {
                       try{
                                //使用域名创建对象
                                InetAddress inet1 = InetAddress.getByName("www.163.com");
                                System.out.println(inet1);
                                //使用IP创建对象
                                InetAddress inet2 = InetAddress.getByName("127.0.0.1");
                                System.out.println(inet2);
                                //获得本机地址对象
                                InetAddress inet3 = InetAddress.getLocalHost();
                                System.out.println(inet3);
                                //获得对象中存储的域名
                                String host = inet3.getHostName();
                                System.out.println("域名:" + host);
                                //获得对象中存储的IP
                                String ip = inet3.getHostAddress();
                                System.out.println("IP:" + ip);
                       }catch(Exception e){}
             }
    }
    

    注意:由于该代码中包含一个互联网的网址,所以运行该程序时需要联网,否则将产生异常。

    TCP编程

    下面分别介绍一下在Java语言中客户端和服务器端的实现步骤。

    客户端:
    在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:

    Socket socket1 = new Socket(“192.168.1.103”,10000);
    
    Socket socket2 = new Socket(“www.sohu.com”,80);
    

    上面的代码中,socket1实现的是连接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是连接到域名是www.sohu.com的计算机的80号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。

    连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:

             OutputStream os = socket1.getOutputStream(); //获得输出流
    
             InputStream is = socket1.getInputStream();     //获得输入流
    

    上面的代码中,分别从socket1这个连接对象获得了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了IO操作,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,然后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,当然这个数据交换过程可以多次进行。

    这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。

    最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:

             socket1.close();
    

    服务器端:
    在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。
    实现服务器端监听的代码为:

             ServerSocket ss = new ServerSocket(10000);
    

    该代码实现的功能是监听当前计算机的10000号端口,如果在执行该代码时,10000号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。

    服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就通知某某某, 然后就可以继续接待其它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。
    实现获得连接的代码是:

             Socket socket = ss.accept();
    

    该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept和前面IO部分介绍的read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。

    连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。这部分的内容和客户端很类似,所以就不重复了,如果还不熟悉,可以参看下面的示例代码。

    最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为:

             ss.close();
    

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 1/5 22/60
    第四周 500/1500 1/6 30/90
    第五周 500/2000 1/7 20/110
    第六周 500/2500 2/9 20/130
    第七周 500/3000 2/11 20/150
    第八周 300/3300 2/13 20/170
    第九周 300/3600 2/15 20/190
    第十周 200/3800 2/17 20/210
  • 相关阅读:
    一套C#语言的日志控制系统
    unity自义定摇杆
    2014 西安邀请赛小结
    Poj 1112 Team Them Up!
    Poj 1112 Rebuilding Roads(树形DP+背包)
    USACO Cow Pedigrees
    Poj 2284 That Nice Euler Circuit
    LA 3942 Remember the Word
    HDU 3065 病毒侵袭持续中
    HDU 2896 病毒侵袭
  • 原文地址:https://www.cnblogs.com/feng886779/p/5468434.html
Copyright © 2020-2023  润新知