Java——网络编程

发布时间 2023-11-22 21:26:38作者: 在这么冷的天

一、概述

  就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

  网络模式一般是指

          OSI参考模型

          TCP/IP参考模型

  

网络通信三要素

    IP地址:InetAddress

      网络中设备的标识,不易记忆,可用主机名

    端口号

      用于标识进程的逻辑地址,不同进程的标识

    传输协议

      通讯的规则

      常见协议:TCP/UDP

二、IP地址

  java提供了一个类来描述ip地址InetAdress

  这个类没有构造方法,一部分还是非静态的

  但是,部分静态方法的返回值类型就是InetAdress,可以通过调用静态的方法来获取该类对象,然后再调用非静态的方法 

  

  static InetAddressgetByName(String host) 确定主机名称的IP地址。

  getHostName 获取主机名

  getHostAddress 获取ip地址

三、端口号

  1)物理端口 网卡口

  2)逻辑端口(我们指的就是逻辑端口)

    每个网络程序都会至少有一个逻辑端口

    用于标识进程的逻辑地址,不同进程的标识

    有效端口:0~65535,其中0~1024系统使用或保留端口

    通过netstat -ano可以查看端口号

四、UDP协议

  将数据源和目的封装成数据包中,不需要建立连接;每个数据包的大小限制在64k;

  因无连接,是不可靠协议;   

  不需要建立连接,速度快

Socket

  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一识别的标识符套接字

  原理机制

    通信的两端都有Socket

    网络通信其实就是Socket间的通信

    数据在两个Socket间通过IO传输

  

 

发送端发送数据

  1.创建Socket对象,java中对udp协议提供了一个类DatagramSocket

  2.将要发送的数据封装成数据包,java提供了一个类DatagramPacket表示数据包

  3.将数据包发送出去

  4.关闭资源

 

  DatagramSocket()   构造数据报套接字并将其绑定到本地主机上的任何可用端口

  DatagramPacket(byte[] buf, int length, InetAddress address, int port)   构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

  byte[] buf   -- 这个其实就是数据的字节数组的形式

  length   -- 数据字节数组的长度

  address   -- 目标的ip地址,需要将其封装成一个InetAddress的对象

  port   -- 接收端绑定的端口号

  

  将数据包发送出去
  ds.send(dp);

  关闭资源
  ds.close();

接收端接受数据

  1.创建接收端的Socket对象

  2.创建一个空的数据包,用于接收发送端发送过来的数据

  3.调用方法接收数据,数据将会被存储到上面创建的数据包中

  4.解析数据包,得到接收到的数据

  5.关闭资源

 

DatagramSocket(int port)  //构造数据报套接字并将其绑定到本地主机上的指定端口

DatagramPacket(byte[] buf, int length)  //构造一个 DatagramPacket用于接收长度的数据包 length

五、TCP传输

  Socket和ServerSocket

  建立客户端和服务器端

  建立连接后,通过Socket中的IO 流进行数据的传输

  关闭socket

  同样,客户端和服务器端是两个独立的应用程序

客户端

  

注意事项

  客户端的Socket对象需要执行服务器的ip地址和端口号,服务器端的Socket对象需要绑定一个端口号

  客户端和服务器端需要获取通道中的流,来进行输入或者输出

  启动的时候要先启动服务器端

服务器端

 

注意

  read方法或者readline方法是阻塞式
  socket.shutdownOutput();  自定义结束标记   注意:只有当明确不会再写数据的时候才会杀死

  服务器端的accept()方法每调用一次只能允许一个客户端的连接