Java从入门到精通2
2023-12-20 14:15:12 5 举报
AI智能生成
第十二章到第二十一章
作者其他创作
大纲/内容
第十二章 集合类
Collection接口
Collection 接口是层次结构中的根接口,构成 Collection 的单位称为元素
list集合
arraylist
ArrayList 类实现了可变的数组,允许保存所有元素,包括 null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢。
linkedlist
LikedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象。需要向集合中插入、删除对象时,使用 LinkedList 类实现的 List 集合的效率较高:但对于随机访问集合中的对象,使用 LinkedList 类实现 List 集合的效率较低。
添加:add() 获取:get() 更改:set() 删除:remove()
set集合
hashset
HashSet类实现 Set 接口,由哈希表(实际上是一个HashMap 实例)支持。它不保证 Set 集合的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用 null元素。
treeset
TreeSet 类不仅实现了 Set 接口,还实现了java.util.SortedSet 接口,因此 TreeSet 类实现的 Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set 集合中的对象进行排序。
map集合
map<k,v> k=键(key) v=值(value)
hashmap
HashMap 类是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。HashMap 类通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
treemap
TreeMap 类不仅实现了 Map 接口,还实现了java.util.SortedMap 接口,因此集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap 类比 HashMap 类性能稍差。由于 TreeMap 类实现的 Map 集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象是null。
第十三章 枚举类型与泛型
枚举
使用枚举类型可以取代前面学习过的定义常量的方式,同时枚举类型还赋予程序在编译时进行检查的功能。
values()方法
枚举类型中的构造方法
使用枚举类型的优势
1、类型安全。
2、紧凑有效的数据定义。
3、可以和程序其他部分完美交互。
4、运行效率高。
2、紧凑有效的数据定义。
3、可以和程序其他部分完美交互。
4、运行效率高。
泛型
语法:类名.<T>
定义泛型类时声明多个类型
语法如下:
class MyClass<T1,T2>{ }
class MyClass<T1,T2>{ }
定义泛型类时声明数组类型
使用泛型类型通配符的语法如下:
泛型类名称<?extends List>a=null;
泛型类名称<?extends List>a=null;
泛型的使用方法
1、泛型的类型参数只能是类类型,不可以是简单类型,如A<int>这种泛型定义就是错误的。
2、泛型的类型个数可以是多个
3、可以使用extends关键字限制泛型的类型
4、可以使用通配符限制泛型的类型
2、泛型的类型个数可以是多个
3、可以使用extends关键字限制泛型的类型
4、可以使用通配符限制泛型的类型
第十四章 Lambda表达式与流处理
lambda表达式 ()->{代码块}
1、lambda 表达式可以调用并修改类成员变量的值。
2、lambda 表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda表达式中的代码并没有被执行,所以运行抽象方法之前类成员变量的值不会发生变化。
3、只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值就会被修改。
2、lambda 表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda表达式中的代码并没有被执行,所以运行抽象方法之前类成员变量的值不会发生变化。
3、只要抽象方法被调用,就会执行 lambda 表达式中的代码,类成员变量的值就会被修改。
方法的引用 ::
这个语法中出现了一个新的操作符“::”,这是由两个英文冒号组成的操作符,冒号之同没有空%。这个操作符左边表示方法所属的类名,右边是方法名。需要注意的是,这个语法中方法名是没有圆据号的。
Fuction 接口
最常用的接口是 Function<T,R>接口,这个接口有以下两个泛型:
T:被操作的类型,可以理解为方法参数类型。
R: 操作结果类型,可以理解为方法的返回类型。
T:被操作的类型,可以理解为方法参数类型。
R: 操作结果类型,可以理解为方法的返回类型。
流处理
数据过滤
flter()方法:是Stream 接口提供的过滤方法。该方法可以将 lambda 表达式作为参数,然后按照 lambda 表达式的逻辑过滤流中的元素。过滤出想要的流元素后,还桑使用 Sgam 提供的 colec0方法按照指定方法重新封装。
distinct():方法:是 Stream 接口提供的过滤方法。该方法可以去除流中的重复元素,效果与 SQL语句中的 DISTINCT 关键字一样.
limit()方法:是Stream 接口提供的方法,该方法可以忽略流中的前 N 个元素.
skip()方法
skip()方法是 Stream 接口提供的法,该方法可以忽略流中的第N个元素
skip()方法是 Stream 接口提供的法,该方法可以忽略流中的第N个元素
数据映射
数据的映射和过滤概念不同:过滤是在流中找到符合条件的元素,映射是在流中获得具体的数据,Stream 接口提供了 map0方法用来实现数据映射,map0 方法会按照参数中的函数逻辑获取新的流对象,新的流对象中元素类型可能与旧流对象元嘉类型不相同。
数据查找
allMatch ()方法是 Stream 接口提供的方法,该方法会判断流中的元素是否全部符合某一条件,返回结果是 boolean 值。如果所有元素都符合条件则返回 true,查则返回 false。
anyMatch()方法是Stream 接口提供的方法,该方法会判断流中的元素是否有符台某条件,只要有一个元素符合条件就返回 true,如果没有元素符合条件才会返回 false。
noneMatch()方法是 Stream 接口提供的方法,给方法会判断流中的所有元素是否都不符合某一条件。这个方法的逻辑和 allMatch0 方法正好相反。
findFirst ()方法是 Stream 接口提供的方法,这个方法会返回符合条件的第一个元素。
数据收集
1、数统计
数据统计不仅不可以筛选出待殊元素,还可以对元素的属性进行统计计算,这种复杂的统计操(作不是由 Steam 实现的,而是由 olectors 收集器类空现的,收集器提供了非常的API,有着其强大的数据控掘能力,
2、数分组
数分组就是将流中元素按照指定的条件分开保存,类似 SQL 语言中的“GROUP BY”关键字。分组之后的数据会按照不同标签分别保存成一个集合,然后按照“键一值” 关系封装在 Map 对象中
数据统计不仅不可以筛选出待殊元素,还可以对元素的属性进行统计计算,这种复杂的统计操(作不是由 Steam 实现的,而是由 olectors 收集器类空现的,收集器提供了非常的API,有着其强大的数据控掘能力,
2、数分组
数分组就是将流中元素按照指定的条件分开保存,类似 SQL 语言中的“GROUP BY”关键字。分组之后的数据会按照不同标签分别保存成一个集合,然后按照“键一值” 关系封装在 Map 对象中
第十五章 I/O(输入/输出)
输入输出流
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。
输入流
程序从指向源的输入流中读取源中的数据,源可以是文件、网络、压缩包或其他数据源。
InputStream 类是字节输入流的抽象类,它是所有字节输入流的父类。
Reader 类是字符输入流的抽象类,所有字符入流实现都是它的子类。
输出流
输出流的指向是数据要达到的目的地,程序通过向输出流中写入数据把信息传递到目的地。
OutputStream 类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类
OutputStream 类中的所有方法均返回 void,在遇到错误时会引发 10Exception 异常。
Writer 类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。
file类
可以使用 File 类创建一个文件对象。
1.File(String pathname)
2.File(String parent,String child)
3.File(File f, String child)
文件输入输出流
FileInputStream 类与 FileOutputStream 类
FileInputStream 类与 FileOutputStream 类都用来操作磁盘文件。如果用户的文件读取需求比较简单,则可以使用 FileInputStream 类,该类继承自 InputStream 类。FileOutputStream 类是 OutputStream 类的子类。
FileReader 和FileWriter 类
由于汉字在文件中占用两个字节如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流 FileReader 类或 FileWriter 类即可避免这种现象。
带缓存的输入输出流
缓存时 I/O 的一种性能优化。缓存流为 I/O 流增加了内存缓存区。
BufferedlnputStream 与 BufferedOutputStream 类
BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装以达到性能的优化。
BufferedReader 与 BufferedWriter 类
BufferedReader 类与 BufferedWriter 类分别继承 Reader 与 Writer 类。这两个类同时具有内部缓存机制,并能够以行单位进行输入/输出。
案例:
数据输入输出流
数据输入/输出流 (DataInputStream 类与 DataOutputStream 类)允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。
案例:
第十六章 反射与注解
反射
众所周知,所有 Java 类均继承了 Object 类,在 Object 类中定义了一个getClass0方法,该方法运回一个类型为Class的对象。例如下面的代码:
JTextFieid textField = new JTextField0; //创建JTextField 对象
Class textFieldC = textField.getClass(); //获取 Class 对象
JTextFieid textField = new JTextField0; //创建JTextField 对象
Class textFieldC = textField.getClass(); //获取 Class 对象
案例:
Annotation注解功能
定义Annotation类型
案例:
访问Annotation信息
如果在定义Annotation类型时将@Retention设置为RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到相关的Annotation信息,如获取构造方法、字段和方法的Annotation信息。
Constructor 类、Field 类和 Method 类均继承了AccessibleObjiect 类,在AccessibleObject 中定义了3个关于Annotation 的方法。其中,方法isAnnotationPresent(Class<?extends Annotation> annotationClass用来查看是否添加了指定类型的 Annotation,如果是则返回 rue,否则返回 false; 方法getAnnotatiot(Class<T>annotationClass)用来获得指定类型的Annotation,如果存在则返回相应的对象,否则返回nul方法getAnnotations()用来获得所有的Annotation,该方法将返回一个Annotation数组。
第十七章 数据库操作
第一步:注册驱动
//第一步注册驱动
DriverManager.registerDriver(new Driver());
DriverManager.registerDriver(new Driver());
第二步:获取连接
//第二步:获取连接
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school java","root","1234")
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/school java","root","1234")
第三步: 获取statement对象
//第三步:获取statement对象PreparedStatement preparedStatement=connection.prepareStatement("select * from couse;")
第四步: 执行SQL语句返回结果集
//第四步: 执行SQL语句返回结果集ResultSet resultSet=preparedStatement.executeQuery();
第五步: 遍历结果集
//第五步:遍历结果集
while(resultSet.next()){System.out.print(resultSet.getlnt("id")+""),System.out.println(resultSet.getString("name"));}
while(resultSet.next()){System.out.print(resultSet.getlnt("id")+""),System.out.println(resultSet.getString("name"));}
第六步: 关闭连接释放资源
//第六步:关闭连接释放资源resultSet.close();preparedStatement.close():
第十八章 Swing程序设计
Swing常用窗体
JFrame窗体
开发 Swing程序的流程可以被简单地概括为首先通过继承javaxswingJFrame类创建一个窗体,然后向这个窗体中添加组件,最后为添加的组件设置监听事件。
案例:
JDialog 对话框
JDialog 对话框继承了java.awt.Dialog 类,其功能是从一个窗体中弹出另一个窗体,如使用IE 浏览器时弹出的确定对话框。
案例:
常用布局管理器
null 绝对布局
绝对布局也叫 null 布局,其特点是硬性指定组件在容器中的位置大小,组件的位置通过绝对坐标的方式来指定。
案例:
FlowLayout流布局管理器
流布局(FlowLayout)管理器是 Swing 中最基本的布局管理器。使用流布局管理器摆放组件时,组件被从左到右摆放。当组件占据了当前的所有空间时,溢出的组件会被移动到当前的下一行。
案例:
BorderLayout边界布局管理器
使用 Swing 创建窗体后,容器默认的布局管理器是边界布局(BorderLayout )管理器 ,边界布局把容量划分为东、南、西、北、中5个区域,但组件被添加到设置为边界布局管理器的容器时,需要使用 BorderLayout 类中成员变量指定被添加的组件在边界布局管理器中的区域。
案例:
GridLayout 网格布局管理器
网格布局(GridLayout)管理器能够把容器划分为网格,组件可以按行、列进行。
案例:
常用面板
JPanel面板
在Swing程序设计中,面板是一个容器,被用于容纳其他组件,
但面板必须被添加到其他容器中。Swing中常用的面板包括JPanel面板和JScrollpane面板
JPanel面板继承Java.awt.Container类,JPanel面板必须在窗体容器中使用,无法脱离窗体显示
但面板必须被添加到其他容器中。Swing中常用的面板包括JPanel面板和JScrollpane面板
JPanel面板继承Java.awt.Container类,JPanel面板必须在窗体容器中使用,无法脱离窗体显示
JScrollPane滚动面板
JScrollPane面板,是带滚动条的面板,被用于在较小的窗体中显示较大篇幅的内容,要注意的是,不能使用布局管理器,只能容纳一个组件,如果添加多个组件,那么需要先将多个组件添加到JPanel面板,再将JPanel面板添加到滚动面板
案例:
文字标签组件与图标
标签被用于显示文本,图标等内容。用户能够通过标签上的文本图标等内容获取相应的提示信息。
JLabel标签
JLabrl标签的父类是JComponent类,标签不能被添加监听器,但是标签显示的文本,图标等内容可以指定对齐方式,通过JLabrl类的构造方法可以创建多种标签,
案例:
图标的使用
在swing程序设计中,图标经常被添加到标签,按钮等组件。
案例:
按钮组件
JButton按钮
Swing 按钮由JButton 对象表示,JButton 常用的构造方法如下:
publicJButton():创建一个不带文本或图标的按钮。
publicJButton(String text):创建一个带文本的按钮。
publicJButton(Icon icon): 创建一个带图标的按钮。
public JButton(String text,Icon icon):创建一个带文本和图标的按钮。
publicJButton():创建一个不带文本或图标的按钮。
publicJButton(String text):创建一个带文本的按钮。
publicJButton(Icon icon): 创建一个带图标的按钮。
public JButton(String text,Icon icon):创建一个带文本和图标的按钮。
案例:
JRadioButton单选按钮
Swing单选按钮由JRadioButton对象表示,在swing程序设计中,需要把多个单选按钮添加到按钮组,当用户选中某个单选按钮时,按钮组中的其他单选按钮将不能被同时选中。
案例 :
JCheckBox复选框
复选框组件由JCheckBox对象表示,以单选按钮不同的是,窗体中的复选框可以被选中多个,这是因为每一个复选框都提供了被选中和不被选中两种状态。
列表组件
JComboBox下拉列表框
初次使用下拉列表框时,会感觉swing中的下拉列表框以WINDOWS操作系统中的下拉列表框有一些相似,实质上两者并不完全相同,因为swing中的下拉列表框不仅可以供用户从中选择
JList列表框
列表框组件被添加到窗体中后,就会被指定长和宽。如果列表框的大小不足以容纳列表项的个数,那么需要设置列表框具有滚动效果,即把列表框添加到滚动面板
案例:
文本组件
JTextField文本框
文本框组件由JTextField对象表示
JPasswordField密码框
JTextArea文本框
案例:
表格组件
创建表格
JTanle类除了提供了默认的构造方法外,还提供了被用于显示二维数组中的元素的构造方法。这个构造方法的语法如下:
JTanle(Object[][]rowDate,Object[]columnNames)
rowDate存储表格数据的二维数组
JTanle(Object[][]rowDate,Object[]columnNames)
rowDate存储表格数据的二维数组
DefaultTableModel 表格数据模型
为了实现使用表格模型创建表格的功能,Swing 提供了表格模型类,即 DefaultTableModel 类。DefaultTableModel类继承了 AbstractTableModel 抽象类且实现了上述 3 个抽象方法。
维护表格模型
当删除表格模型中的指定行时,每删除一行,其后所有行的索引值将相应的减一,所以当连续删除多行时,需要注意对删除行索引的处理。
事件监听器
ActionEvent 动作事件
动作事件(ActionEvent)监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它监听,如按钮被单击等。
KeyEvent 键盘事件
当向文本框中输入内容时,将发生键盘事件。KeyEvent 类负责捕获键盘事件,可以通过为组件添加实现了 KeyListener 接口的监听器类来处理相应的键盘事件。
KeyListener 接口共有 3 个抽象方法,分别在发生击键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发,具体如下:
KeyListener 接口共有 3 个抽象方法,分别在发生击键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发,具体如下:
MouseEvent 鼠标事件
所有组件都能发生鼠标事件,MouseEvent 类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener 接口的监听器类来处理相应的鼠标事件。
MouseListener 接口共有 5个抽象方法,分别在光标移入或移出组件、鼠标按键被按下或释放和发生单击事件时被触发。所谓单击事件,就是按键被按下并释放。需要注意的是,如果按键是在移出组件之后才被释放,则不会触发单击事件。MouseListener 接口的具体定义如下:
MouseListener 接口共有 5个抽象方法,分别在光标移入或移出组件、鼠标按键被按下或释放和发生单击事件时被触发。所谓单击事件,就是按键被按下并释放。需要注意的是,如果按键是在移出组件之后才被释放,则不会触发单击事件。MouseListener 接口的具体定义如下:
第十九章 Java绘图
Java绘图类
Graphics类
Graphics 类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。 Graphics 类封装了 Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。利用这些方法可以实现直线、矩形、多边形、椭圆、弧形等形状和文本、图形的绘制操作。
Graphics2D类
使用 Graphics 类可以完成简单的图像绘制任务,但是它所有实现的功能非常有限,如无法改变线条的粗线、不能对图片使用旋转和模糊等过滤效果。
Graphics2D 类继承Graphics 类,实现了功能更加强大的绘图操作的集合。
Graphics2D 类继承Graphics 类,实现了功能更加强大的绘图操作的集合。
绘制图形
Java可以分为使用 Graphics 类和 Graphics2D 类绘制图形,Graphics 类使用不同的方法实现不同图形的绘制。
案例:
绘制颜色与画笔属性
设置颜色
使用 Color 类可以创建任意颜色的对象,不用担心平台是否支持改颜色,因为 Java 以跨平台和与硬件无关的方式支持颜色管理。
设置画笔
默认情况下,Graphics 类使用的画笔属性是粗细为1个像素的正方形,而 Graphics2D 类可以调用 setStroke() 方法设置属性,如果改变线条的粗细、虚实,定义线端点的形状、风格等。
绘制文本
显示文字
案例:
显示图片
绘图不仅可以绘制图形和文本,还可以使用 drawImage() 方法将图片资源显示到绘图上下文中,而且可以实现各种特效处理。
案例:
图像处理
放大与缩小
使用了 drawImage() 方法将图片以原始大小显示在窗体中,要想实现图片的放大与缩小,则需要使用他的重载方法。
图像翻转
图像的翻转需要使用 drawImage() 方法的另一个重载方法。
此方法总是用来非缩放的图像来呈现缩放的矩形,并动态地执行所需要的缩放。此操作不使用缓存的缩放图像。执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像,以保持这些映射关系
图像旋转
图像旋转需要调用 Graphics2D 类的 rotate()方法,该方法将根据指定的弧度旋转图像。
案例:
图像倾斜
可以使用 Graphics2D 类提供的 shear()方法设置绘图的倾斜方向,从而使图像实现倾斜的效果。
案例:
第二十章 多线程
创建线程
在 Java 中,主要提供两种方式实现线程,分别为继承 java.lang.Thread 类与实现 java.lang.Runnable接口。
继承Thread类
Thread 类是 java.lang 包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。
案例:
实现Runnable接口
到目前为止,线程都是通过扩展 Thread 类来创建的,如果程序员需要继承其他类(非 Thread 类)而且还要使当前类实现多线程,那么可以通过 Runnable 接口来实现。
案例:
线程的生命周期
一旦线程进入可执行状态,它会在就绪与运行状态下转换,同时也有可能进入等待,休眠,赌塞或死亡状态。
要使线程处于就绪,有以下几种方法:
调用 sleep() 方法。
调用 wait() 方法。
等待输入/输出完成。
当线程处于就绪状态后,可以用以下几种方法使线程再次进入运行状态:
线程调用 notify() 方法。
线程调用 notifyAll() 方法。
线程调用 interrupt() 方法。
线程的休眠时间结束。
输入/输出结束。
要使线程处于就绪,有以下几种方法:
调用 sleep() 方法。
调用 wait() 方法。
等待输入/输出完成。
当线程处于就绪状态后,可以用以下几种方法使线程再次进入运行状态:
线程调用 notify() 方法。
线程调用 notifyAll() 方法。
线程调用 interrupt() 方法。
线程的休眠时间结束。
输入/输出结束。
操作线程的方法
线程的休眠
一种能控制线程行为的方法是调用 sleep() 方法需要一个参数用于指定该线程休眠的时间,该时间以毫秒为单位。
案例:
线程的加入
当某个线程使用 join() 方法的加入一个线程时,另外一个线程会等待该线程执行完毕后再继续执行。
案例:
线程的中断
以往有时候会使用 stop() 方法停止线程,但当前版本的 JDK 早已废除了 stop() 方法,不建议使用 stop() 方法来停止一个线程的运行。现在提倡在 run() 方法中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。
如果线程是因为使用了 sleep()或 wait()方法进入了就入就绪状态,可以使用 Thread()方法,同时程序破除了 InterruptedException 异常,在异常处理时结束了 while 循环。在项目中,经常在这里执行关闭数据连接和关闭 Socket 连接等操作。
如果线程是因为使用了 sleep()或 wait()方法进入了就入就绪状态,可以使用 Thread()方法,同时程序破除了 InterruptedException 异常,在异常处理时结束了 while 循环。在项目中,经常在这里执行关闭数据连接和关闭 Socket 连接等操作。
案例:
线程的礼让
Thread 类提供了一种礼让方法,使用 yied()方法表示,它只是给当前正处于运行状态的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
线程的优先级
线程的优先级可以使用 setPriority()方法调整,如果使用该方法设置的优先级不在 1~10,将产生IllegalArgumentException 异常。
案例:
线程同步
在单线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但是如果使用多线程程序,就会发生两个线程抢占资源的问题,如两个人同事说话、两个人同时过同一个独木桥
线程安全
在编写多线程时时,因该考虑到线程安全问题。实质上线程问题来源两个线程同时存取单一对象的数据。
案例:
线程同步机制
所以解决多线程资源问题的方法基本上都是采用给定时间只允许一个线程访问共享资源的方法。
1、同步块
语法如下:
synchronized(Object){
}
synchronized(Object){
}
案例:
2、同步方法
语法如下:
synchronized void f(){
}
synchronized void f(){
}
案例:
第二十一章 通信网络
网络程序设计基础
局域网与互联网
服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。
网络协议
1、IP协议
IP 是Internet Protocol 的简称,是一种网络协议。Intemet 网络采用的协议是TCP/IP 协议,其全称是Transmission Control Protocol/Inteet Protocol。
TCP/IP 模式是一种层次结构,共分为 4 层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性。
TCP/IP 模式是一种层次结构,共分为 4 层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对的独立性。
2、TCP与UDP协议
在 TCP/IP 协议栈中,有两个高级协议,即传输控制协议(Transmission Control Protocol,TCP) 与用户数据报协议 (User Datagram Protocol,UDP)。
TCP 协议是一种以固接连线为基础的协议,它提供两台计算机间可靠的数据传送。UDP 协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。
TCP 协议是一种以固接连线为基础的协议,它提供两台计算机间可靠的数据传送。UDP 协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。
端口与套接字
一般而言,一台计算机只有单一的连到网络的物理连接 (Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口(port)
网络程序中的套接字(Socket) 用于将应用程序与端口连接起来。套接字是一个假想的连接装置就像插座一样可连接电器与电线,如图 21.4 所示。Java 将套接字抽象化为类,程序设计者只需创建 Socke类对象,即可使用套接字。
TCP程序
TCP 网络程序设计是指利用 Socke 类编写通信程序。利用IP 协议进行通信的两个应用程序是有主次之分的,二个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。
InetAddress类
java.net 包中的 InetAddress 类是与 IP 地址相关的类,利用该类可以获取 IP 地址、主机地址等信息
案例:
ServerSocket类
java.net 包中的 ServerSocket 类用于表示服务器套接字,其主要功能是等待来自网络上的“请求”它可通过指定的端口来等待连接的套接字。
ServerSocket 类的构造方法通常会抛出 IOException 异常,具体有以下几种形式:
ServerSocket(): 创建非绑定服务器套接字。
ServerSocket(int port): 创建绑定到特定端口的服务器套接字。
ServerSocket(int port,int backlog): 利用指定的 backlog 创建服务器套接字,并将其绑定到指定的本地端口号上。
ServerSocket(int port, int backlog, InetAddress bindAddress): 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。这种情况适用于计算机上有多块网卡和多个 IP 地址的情况,用户可以明确规定 ServerSocket 在哪块网卡或哪个 IP 地址上等待客户的连接请求。
ServerSocket(): 创建非绑定服务器套接字。
ServerSocket(int port): 创建绑定到特定端口的服务器套接字。
ServerSocket(int port,int backlog): 利用指定的 backlog 创建服务器套接字,并将其绑定到指定的本地端口号上。
ServerSocket(int port, int backlog, InetAddress bindAddress): 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。这种情况适用于计算机上有多块网卡和多个 IP 地址的情况,用户可以明确规定 ServerSocket 在哪块网卡或哪个 IP 地址上等待客户的连接请求。
TCP网络程序设计
明白了 TCP 程序工作的过程,就可以编写 TCP 服务器程序了。在网络编程中,如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。
案例:
UDP程序
DatagramPacket 类
java.net 包中的 DatagramSocket 类用于表示发送和接收数据包的套接字。该类的构造方法如下:
DatagramSocket()。
DatagramSocket(int port).
DatagramSocket(int port, InetAddress addr)
DatagramSocket()。
DatagramSocket(int port).
DatagramSocket(int port, InetAddress addr)
UDP网络程序设计
广播数据报是一项较新的技术,其原理类似于电台广播。广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波段、频率,才可以收听广播内容。
案例:
案例:
收藏
收藏
0 条评论
下一页