网络编程
一,网络通信三要素
ip地址:用于标识网络中的计算机设备
格式:xxx.xxx.xxx.xxx,每一段的范围0~255
端口号:用于标识计算机中的应用
格式:ip地址:端口号
取值范围:0~65535
常见的端口号:8080、3306、1521
通信协议:网络通信时要遵守的规则
常见的协议:TCP、UDP
1.1 UDP
用户数据报协议(User Datagram Protocol)
特点:
不可靠的
效率高
单次发送数据的大小64K
应用场景:在线视频
在代码中的特点:发送的数据必须和目标地址一同封装在数据包中
核心类:DatagramSocket、DatagramPacket
1.2 TCP
传输控制协议(Transmission Control Protocol)
特点:
可靠(三次握手)
效率低
单次发送数据的大小没有限制
应用场景:聊天、下载
在代码中的特点:通过输入输出流来完成通信
核心类:ServerSocket服务端、Socket客户端
1.3 InetAddress
在java.net中的一个用于获取网络相关信息的类
常用静态方法:
getLocalhost():获取本机的InetAddress对象
getByName(String s):获取指定域名或者ip地址的InetAddress对象
二,异常
2.1 异常的体系结构
Java中程序在运行期间所发生的不正常情况就是异常,系统将各种异常封装成了一种数据类型--异常类
Exception
Throwable:
Throwable
类是 Java 语言中所有错误或异常的超类。只有是
Throwable
或者它的子类对象才能使用throw
关键字抛出只有是
Throwable
或者它的子类才能的catch
参数的类型
Exception:
Exception
类及其子类是Throwable
的一种形式,它指出了合理的应用程序想要捕获的条件。Error:
Error
是Throwable
的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
2.2 异常处理的方式 throws
关键字:
throws
格式:
范围修饰符 返回类型 方法名(参数列表) throws 异常类{ 方法体 }
作用:抛出异常类,告知调用者当前方法存在异常
问:为什么抛出异常并没有实质上的解决掉异常还需要进行抛出
答:因为对于同一个异常来说,处理的方式可以各不相同,所以不在发生异常的方法中处理,而在调用处,由调用者决定如何处理
注:
抛出的异常类必须是所发生的异常或者它的父类
如果父类方法没有抛出异常,子类重写也不能抛出异常
如果抛出的异常是
RuntimeException
或者它的子类,那么调用者可以不做处理;反之,必须处理
2.3 异常处理的方式 try-catch
格式1:
try{ }catch(异常类 对象){ }
格式2:
try{ }finally{ }
格式3:
try{ }catch(异常类 对象){ }finally{ }
格式说明:
try代码块中是可能发生异常需要进行检查的语句
try代码块中一旦发生了异常会立即进入到catch代码块中,如果try中没有异常则不进入catch
finally代码块中的代码一定会执行,通常用于释放资源
catch代码中的异常类只能是try中所发生的异常或者它的父类
多个异常的处理方式:
多个异常一次处理
Random r = new Random(); int[] arr = {0,1,2,3}; try { System.out.println(10 / arr[r.nextInt(6)]); }catch (Exception e){ System.out.println("出错了"); } // 使用Exception类接收所有异常情况,好处就是方便,弊端是无法明确发生的是具体哪一种异常
多个异常分别处理
Random r = new Random(); int[] arr = {2,1,0,3}; try { int index = r.nextInt(6); System.out.println(index); System.out.println(10 / arr[index]); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("集合下标越界"); }catch (ArithmeticException e){ System.out.println("除0了"); }
注:
如果多个catch后的异常类没有继承关系,那么它们的位置顺序是任意的
如果多个catch后的异常类有继承关系,那么父类异常必须在子类异常之后
可以在多个catch后添加上Exception来处理没有捕获到的异常
Random r = new Random(); int[] arr = {2,1,0,3}; try { System.out.println(arr.length); int index = r.nextInt(6); System.out.println(index); System.out.println(10 / arr[index]); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("下标越界"); }catch (ArithmeticException e){ System.out.println("除0了"); }catch (NullPointerException e){ System.out.println("空指针了"); }catch (Exception e){ System.out.println("未知异常"); }
2.4 finally的使用
FileOutputStream fos = null; try { fos = new FileOutputStream("C:\\users\\86151\\Desktop\\demo.txt"); fos.write("哈哈哈".getBytes()); }catch (FileNotFoundException e){ System.out.println("文件路径找不到"); }catch (IOException e){ System.out.println("写入动作发生异常"); }finally { try{ if(fos != null){ fos.close(); } }catch (IOException e){ System.out.println("关闭资源发生异常"); } }
注:无论try、catch中返回的是什么,只要finally中有返回,返回结果一定是finally中的
2.5 异常的处理的方式 throw
throw关键字用于抛出异常对象,表示当满足某种异常情况时需要调用者对抛出的异常对象进行处理
public static void f(int[] a ,int index1,int[] b,int index2,int len){ if(index1 >= a.length){ ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("a的下标超过了a的最大下标"); System.out.println(e.hashCode()); throw e; } if(index2 >= b.length){ ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("b的下标超过了b的最大下标"); System.out.println(e.hashCode()); throw e; } if(index1 + len > a.length){ throw new ArrayIndexOutOfBoundsException("获取的数量超过了a的最大下标"); } if(index2 + len > b.length){ throw new ArrayIndexOutOfBoundsException("获取的数量超过了b的最大下标"); } for(int i = index1;i < index1 + len;i++){ b[index2] = a[i]; index2++; }
2.6 自定义异常类
步骤:
定义类继承Exception
定义无参构造函数和重载一个参数是String类型的构造函数