美文网首页
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程序进阶课程学习(二)

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

  • Java程序进阶课程学习(四)

    写在前面 在上一部分的学习中,我们对 JVM 的基础概念、JVM运行时内存、类加载机制有了基本的了解。下面我们开始...

  • Java程序进阶课程学习(五)

    写在前面 之前我们大概学习了集合类的相关知识。了解了一下基本的结合类和其中的一些方法。但是,对于集合类的性能,并没...

  • Java程序进阶课程学习(三)

    写在前面 前面两节,我们学习了关于,并发编程 & 网络编程的 一些基础知识,有了基本的了解。这一部分我们学习一下关...

  • Java程序进阶课程学习(一)

    写在前面 继之前的 Java 的基础课程之上,来看下 Java 的进阶课程主要包括了 多线程的概念和一些虚拟机的知...

  • Java程序进阶课程学习(六)

    写在前面 上一部分中,我们对 Java 中的 集合框架和具体的集合类进行了一定的了解(作为 java 中常用的一些...

  • Java进阶

    注:采转归档,自己学习查询使用 Java进阶01 String类Java进阶02 异常处理Java进阶03 IO基...

  • Java进阶之路(转)

    Java进阶之路——从初级程序员到架构师,从小工到专家来源:极客头条原文 怎样学习才能从一名Java初级程序员成长...

  • Java编程语言基础知识进阶学习路线及目标

    Java编程语言基础知识进阶学习内容及学习目标,此阶段学习具备JavaSE基本开发技巧,可胜任简单单机应用程序。对...

  • Java学习路线图--Java语言进阶

    Java学习路线图的第二部分是Java语言进阶学习,在学完了第一阶段的Java语言入门后,大家对Java语言学习有...

网友评论

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

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