概述
- 计算机网络
- 网络编程目的
- 通过实现网络软件,与各个计算机传递共享资源
- 如何定位各个计算机
- 下面组成要素进行分析
组成要素
-
- IP :计算机的互联网地址
- 端口 :计算机中软件的具体进程的识别号,任务管理器中为PID
- 通信协议 :计算机相互之间传递资源,需要遵循的约定 如:速率、传输码率、代码结构等
IP
-
有两种类型
- ipv4 : 由4个字节组成 每个字节的范围是 0-255 (2^8) 如:(0-255).(0-255).(0-255).(0-255)
- ipv6 :由8个字节组成 每个字节的范围是0-65535 (2^16) 如:(0-FFFF).(0-FFFF).(0-FFFF).(0-FFFF)
- 因为范围有216,所以采用十六进制表示,一个F为0-F共16个数字或字母,即24,有4位数,所以表示16位就有最多4位数字或字母
-
IP的分类 (ABCD类)
- A类网络的IP地址范围为:1.0.0.0-126.255.255.254
- B类网络的IP地址范围为:128.0.0.0-191.255.255.254
- C类网络的IP地址范围为:192.0.0.0-223.255.255.254
- d类网络的IP地址范围为:224.0.0.0-239.255.255.255
- 规律是,把第一个字节拆分一半前半部分为A类,后半部分继续递归拆分
端口
- 分类
- 公有端口 0 - 1023 (2^10)
- 程序注册端口 0 - 49151 (215+214)
- 动态、私有端口 49152 - 65535 (2^16)
通信协议
- OSI七层模型 和 TCP/IP 五层模型
TCP协议
-
生活例子:打电话
-
特性 :连接 稳定
-
流程
- 最少需要两对象 :客户端 和 服务端
- 经过 三次握手 和 四次分手
- 三次握手:
- A获取B的地址端口,尝试与B连接
- B监听到有连接,接取连接回应A
- A接收到B回应,再次回应B
- 四次分手:
- A通知B需要断开连接
- B接到通知询问A确定是否断开
- A回应B确定,并断开了连接
- B接到A回应,并断开了连接
- 三次握手:
-
代码例子
- 客户端
class A{ public static void main(String[] args){ //创建socket连接 参数为 ip 和 port Socket socket = new Socket(InetAddress.getByName("0.0.0.0"),port); //socket连接成功不报错,可以获取输出流回应服务端 OutputStream os = socket.getOutputStream(); //写入数据 os.write("hello world".getBytes()); //结束输出 socket.shutdownOutput(); //后续结束连接关闭服务 os.close(); socket.close(); } }
- 服务端
class b{ public static void main(String[] args){ //创建服务器的socket 并开放其端口号 ServerSocket socket = new ServerSocket(port); //通过服务器的socket监听发过来的连接请求 (阻塞连接) Socket accept = socket.accept(); //连接成功接收客户端发来的数据 InputStream is = accept.getInputStream(); //I/O读写数据 byte[] buffer = new byte[1024]; int len = 0; //因不知道数据类型,用管道流接收 ByteArrayOutputStream baos = new ByteArrayOutputStream(); while((len=is.read(buffer))!= -1){ baos.write(buffer,0,len); } System.out.print(baos.toString()); } }
UDP协议
-
生活例子:发短信
-
特性:不稳定 单方面
-
流程:
- 需要接收方的 IP 和 端口 信息
- 通过连接的方式 DatagramSocket
- 发送的内容
-
代码例子
- 发送方
class A{ public static void main(String[] args){ //创建DatagramSocket进行发送 DatagramSocket socket = new DatagramSocket(); //发送需要的内容 参数需要 数据字节数组 数组偏移量 数组长度 IP 端口 byte[] buffer = "hello world".getBytes(); DatagramPacket packet = new DatamgramPacket(buffer,0,buffer.length,InetAddress.getByName("0.0.0.0"),port); //发送 socket.send(packet); } }
- 接收方
class B{ public static void main(String[] args){ //创建DatagramSocket连接 ,并开放其端口 DatagramSocket socket = new DatagramSocket(port); //需要接收内容的驿站 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); //接收 socket.receive(packet); //输出其信息 byte[] data = packet.getData(); System.out.print(new String(data,0,data.length)) } }
URL
- 定义:统一资源定位符,定位互联网上的某一个资源
- 定位的格式: 协议:// IP : port /项目名/资源
//如:利用url下载网上的资源
Url url = new Url(定位的格式);
//调用url的连接方法获取输入流
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
InputStream fis = connection.getInputStream();
//利用IO输出即可