计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。
现在最广泛的是TCP/IP协议(传输控制协议/英特网互联协议)
UDP协议。
TCP/IP协议分为四层:
链路层:用于定义物理传输,通常是对某些网络连接设备的驱动协议,例如针对光纤、提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
InetAdderss类:用于封装一个IP地址。
public static void main(String[] args) throws UnknownHostException {
InetAddress inet=InetAddress.getByName("192.168.137.1"); InetAddress inet2=InetAddress.getLocalHost(); //从inet对象中获取ip地址 System.out.println(inet2); //获取主机名 System.out.println(inet2.getHostName()); }UDP协议:
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。
在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议:
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
由于TCP协议的面向连接特性,它可以保证传输数据的全性安,所以是一个被广泛采用的协议,例如在下载文件时,如果数据接收不完整,将会导致文件数据丢失而不能被打开,因此,下载文件时必须采用TCP协议。
UDP通信:
DatagramPacke类:
用于封装UDP通信中发送或者接收的数据。
DatagramSocket类:
将发送端或者接收端的数据封装起来。
public class UDPSend {
public static void main(String[] args) throws IOException { //封装数据 byte[] bytes="你好UDP".getBytes(); //封装ip地址 InetAddress inet=InetAddress.getByName("127.0.0.1"); //1.创建数据打包对象,封装要发送的数据、长度、接受端ip和端口号 DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6000); //2.创建DatagramSocke对象(快递公司) DatagramSocket ds=new DatagramSocket(); //3.发送数据包 ds.send(dp); //释放资源 ds.close(); }}public class UDPReceive {
public static void main(String[] args) throws IOException { //1.创建DatagramSocket对象(快递公司)明确端口号 DatagramSocket ds=new DatagramSocket(6000); //2.创建字节数组负责接受发来的数据 byte[] bytes=new byte[1024]; //3.创建数据拆包对象 DatagramPacket dp=new DatagramPacket(bytes, bytes.length); //4.接收数据包 ds.receive(dp); //5.拆包 //获取接收的数据长度 int length=dp.getLength(); //获取发送端ip地址 String ip=dp.getAddress().getHostAddress(); //获取发送端的端口号 int port=dp.getPort(); System.out.println("ip地址为"+ip+"端口号为"+port+"发送的内容"+new String(bytes,0,length)); }}
TCP通信:
ServerSocket类:用于实现一个服务器端的程序。
Socket类:用于实现客户端的程序。
public class TCPServer {
public static void main(String[] args) throws IOException { //1.创建服务器端对象serversocket明确端口号 ServerSocket server=new ServerSocket(6666); //2.调用accept方法与客户端创建连接,并获取连接的客户端对象 Socket socket=server.accept(); //3.从客户端对象中获取输入流,接收数据 InputStream in=socket.getInputStream(); byte[] bytes=new byte[1024]; //获取ip地址 String ip=socket.getInetAddress().getHostAddress(); //获取客户端端口号 int port=socket.getPort(); System.out.println("ip地址为"+ip+"端口号为"+port+":"); int len=in.read(bytes); System.out.println(new String(bytes,0,len)); //回复客户端 //获取从客户端对象中获取字节输出流,将数据回复给客户端 OutputStream out=socket.getOutputStream(); out.write("收到".getBytes()); //释放资源 server.close(); }}public class TCPClient {
public static void main(String[] args) throws IOException { //1.创建Socket对象,连接服务器 Socket socket=new Socket("127.0.0.1",6666); //2.从socket对象中获取输出流,将数据写向服务器 OutputStream os=socket.getOutputStream(); //3.写数据 os.write("你好服务器".getBytes()); //接收服务器端的回复 //从socket对象中获取字节输入流,接收服务器的回复数据 InputStream in=socket.getInputStream(); //创建字节数组 byte[] bytes=new byte[1024]; //获取服务器端的ip地址 String ip=socket.getInetAddress().getHostAddress(); //获取服务器端的端口号 int port=socket.getPort(); System.out.println("ip地址为"+ip+"端口号为"+port+":"); int len=in.read(bytes); System.out.println(new String(bytes,0,len)); //4.释放资源 socket.close(); }}