美文网首页
Java程序进阶课程学习(二)

Java程序进阶课程学习(二)

作者: MikeShine | 来源:发表于2020-02-03 11:02 被阅读0次

    写在前面

    上一份笔记中,我们记录了本课程的前三章,关于并发编程的部分。
    下面我们接着看,关于 网络编程 的相关部分。


    4.2 URL 对象

    首先,我们要学习的是访问网络资源(比如说一个网页)。而在 Java 中,对于网络资源的访问,通常是 使用 URL 类来实现的。本小节就介绍了 URL 这个类及其简单用法。
    这里作者给出了一个通过URL读取WWW信息的例子(其实这个就是一个 java 爬虫,爬的是网页源码)。
    还介绍了构造 URL 对象的构造方法。具体的可以去看类的构造方法。


    4.3 URLConnection 对象

    上面一个小节介绍了URL对象,可以实现对网络资源的访问。而比URL更强大的,是URLConnection 对象。
    顾名思义,URLConnection对象代表一个 URL资源与Java程序的通讯连接,我们可以通过该对象,对URL资源进行 读或写
    比 URL对象更为强大的是:

    • URL只能读(单向),URLConnection可以读和写(双向)
    • URLConnection 可以查看服务器的响应头部
    • URLConnection 可以设置客户端请求的头部

    使用 URLCOnnection 通信的一般步骤

    • 构造一个URL对象
    • 调用URL对象的 openConnection() 方法,获取该对象对应的 URLConnection 对象
    • 配置该 URLConnection 对象
    • 读取首部字段
    • 获得输入流读取数据
    • 获取输出流写入数据
    • 关闭连接

    这里还是通过抓取新浪的例子,来说明了 URLConnection 读写WWW资源。(课程的例子中只有读,没有写)


    4.4 Get请求 和 Post请求

    这一节里面,作者介绍了用 java 如何编写 GET 请求 和 POST 请求。
    都是应用 URLConnection 对象来实现的。
    除了URLConnection 类,还有一个 HTTPURLConnection 类,更加好用。


    4.5 Socket 通讯原理

    首先我们需要理解的是,什么是 socket。
    Socket 直译的话,是“插座”的意思。而在一个操作系统中,系统使用 socket 将底层的 TCP/IP 协议封装起来,用户不需要了解更底层的协议,写出来的代码自然是符合相关网络传输协议的了。


    抽象 Socket 层

    每一个 Socket 需要对应一个 ip + port(很好理解,需要唯一定位),这个叫做 bind(),绑定。

    简单理解,就是一层抽象封装。

    对于 Socket , 还有一个生动的例子。
    将socket通信类比为打电话这一生活场景。这里我把TCP服务器比作政府某一服务部门能,TCP客户端比作企业中某一部门电话,描述这一过程,恰好就像是socket通信,服务部门提供服务,企业部门申请服务。
    要实现通信,首先政府部门都必须申请一个电话(socket_fd),并向有关部门注册(我们的系统),提供地址(sockadrr)以及属于哪个部门的(port),录入系统后,就算是合约生效了(bind),于是乎,政府广而告之,这个服务热线就算开通了,在部门里面的人员所需要做的事情,就是等待企业家拨打热线(listen)。
    企业家拨打电话对地点和部门没有这么多的要求了,他并不需要绑定地址和部门,在任何一个可以拨打电话的地方(可能是同个部门,也可以同公司不同部门,甚至可能是竞争对手),他只需要拿起一个已经注册的电话(socket_fd),拨打电话(connect)
    政府部门接通电话(accept)后,桥梁就打通了(服务者client_fd、顾客server_fd),可以进行听说了(read write)。企业家咨询完成(close),政府到点下班关闭服务(close)


    4.6 Socket 通讯实现

    这里,作者给出了一个简单的聊天 C/S 代码。说明Socket通讯的简单实现。
    其实,Socket 流 编程 最后就会成为输入输出流编程。


    5. 多端网络编程

    上一章中,我们介绍了网络编程的基础知识,这一章节主要看一下多端网络编程的实现。


    5.2 Socke多客户端通信实现

    这一节中,作者给出了多个客户端和一个服务器进行通讯的思想和实现。
    核心思想就是说,在服务器端开启多个线程,每一个线程对应处理一个客户端。
    因此,这个时候就需要一个线程类来,并在其 run() 方法中实现 ServerSocket 对象的生成,以及相关的处理.

    /**
     * 多客户端聊天的服务器进程类
     */
    
    public class ServerThread extends Thread {
        Socket socket = null;
        int clientNum;
        public ServerThread(Socket socket, int num){
            this.socket = socket;
            clientNum = num+1;
        }
    
        @Override
        public void run() {
            try{
                String line;
                // 输入流,用来收取从网络收来的数据
                BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 输出流,用来将服务器的内容发送到网络客户端
                PrintWriter os = new PrintWriter(socket.getOutputStream());
                // 输入流,用来获取键盘的输入
                BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Client"+clientNum+":"+is.readLine());
                line = sin.readLine();
                while (!line.equals("bye")){
                    os.println(line);
                    os.flush();
                    System.out.println("Server:" + line);
                    System.out.println("Client:" + clientNum+":"+is.readLine());
                    line = sin.readLine();
                }
                os.close();
                is.close();
                socket.close();
            }catch (Exception e){
                System.out.println(e);
            }
        }
    }
    
    

    5.3 数据包通信UDP

    我们这一章经常讲的,都是基于TCP协议的通信。
    这一个小节作者介绍了基于 UDP 的通信及其相对应的类,有 DatagramPacket, DatagramSocket, MulticastSocket等。
    这里作者给出了一个查询股票的例子,用来说明我们如何发送、接收、返回数据报的。
    逻辑上来说,比较简单

    • 客户端发送一个 DatagramPacket 对象(通过一个DatagramSocket 对象)
    • 服务器根据接收到的 DatagramPacket 对象 获得客户端的 IP+Port
    • 服务器构造自己的 DatagramPacket 对象,并且发送

    5.4 使用数据报进行广播

    上一小节中,我们使用 DatagramSocket 可以监听来自某个地址的数据报。
    为了完成广播的功能,我们使用 MulticastSocket 类,来广播和监听。

    这一个小节大概了解一下就行。
    作者给出的例子的代码还是挺复杂的。


    5.5 网络聊天程序

    这一个小节实际上是把前面讲的 Socket 编程和图形化界面 Swing 联系起来,写了一个含有简单图形界面的聊天程序。没有什么别的。

    相关文章

      网友评论

          本文标题:Java程序进阶课程学习(二)

          本文链接:https://www.haomeiwen.com/subject/pbxhxhtx.html