【JAVA入门】网络编程

发布于:2022-12-23 ⋅ 阅读:(416) ⋅ 点赞:(0)

目录

思维导图

一、网络编程入门

1、网络编程概述

2、网络编程三要素

二、UDP协议

1、UDP发送数据

2、UDP接收数据

三、TCP通信程序

1、TCP通信原理

2、TCP发送数据

3、TCP接收数据


思维导图

一、网络编程入门

1、网络编程概述

计算机网络:是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程:在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换

2、网络编程三要素

2.1、IP地址、端口、协议

IP地址:

  • 为了让网络中的计算机能够相互通信,必须为没台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机和识别发送的计算机,IP地址就是标识号,也是设备的标识

端口:

  • 网络的通信,本质上是两个应用程序的通信,每台计算机都有很多的应用程序,在网络通信时,端口号就可以唯一标识设备中的应用程序,也就是应用程序的标识

协议:

  • 通过计算机网络可以使多态计算机实现连接,位于同一网络中的计算机在进行连接和通信时要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了同一规定,通信双方必须遵守才能完成数据交换,常见的协议有UDP协议和TCP协议。

2.2、IP地址

IP地址:时网络中设备的为一标识,分为IPV4和IPV6两大类

IPV4:给每个连接在网络上的主机分配一个32bit地址,按照TCP/IP规定,IP地址用二进制来表示,每个地址长32bit,也就是4个字节,为了方便使用,IP地址通常写成10进制的形式,中间使用’ .‘分格不同字节(点分十进制表示法)。

IPV6:为扩大地址空间,IPV6采用128 位地址长度,分成8 组16进制数。

2.2.1、常用命令

  • ipconfig :查看本机地址

  • ping IP地址:检查网络是否连通

特殊IP地址

  • 172.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

2.2.2、InetAddress类

为了方便对IP地址的获取和操作,Java提供了InetAddress供我们使用

InetAddress:此类表示Internet协议地址

常用方法

static InetAddress getByName(String host):确定主机名称的IP地址,主机名可以是机器名称或IP地址

String getHostName():获取此IP地址的主机名

String getHostAdress():返回文本显示中的IP地址字符串

public class Demo2 {
   public static void main(String[] args) throws UnknownHostException {
       //static InetAddress getByName(String  host):确定主机名称的IP地址,主机名可以是机器名称或IP地址
       InetAddress address =InetAddress.getByName("LAPTOP-O4PAJK5L");
      //String  getHostName():获取此IP地址的主机名
       String name =address.getHostName();
       System.out.println(name);
       //String  getHostAdress():返回文本显示中的IP地址字符串
       String str=address.getHostAddress();
       System.out.println(str);
  }
}

2.3、端口

端口:设备上应用程序的唯一标识

端口号:用两个字节表示的整数,它的取值范围是0~65535,其中,0~1023之间的端口号用于一写知名的网络服务和应用,普通应用程序需要使用1024以上的端口号,如果端口号被另一个服务或应用占用会导致当前程序启动失败。

2.4、协议

协议:计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议:用户数据报协议(User Datagram Protocol)

  • 面向无连接的的通信协议,传输时发送端和接收端不建立逻辑连接(发出数据前不确认接收端是否存在,接收端接收到数据后也不会返回是否接收到数据),消耗资源小,通信效率高,一般用于音频,视频和普通数据的传输,传输重要数据是不建议使用

TCP协议:传输控制协议(Transmission Protocol)

  • 面向连接的通信协议,传输前发送端和接收端会建立逻辑连接,然后再传输数据。提供了两台计算机之间的可靠无差错的数据传输,在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的船舰都需要经过“三次握手”,可以保证传输数据的安全。

  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接问题

    (1)第一次:客户端向服务器端发出连接请求,等待服务器确认

    (2)第二次:服务器端向客户端回送一个响应,通知客户端收到了连接请求

    (3)第三次:客户端再次向服务器发送确认信息,确认连接

二、UDP协议

UDP协议是一种不可靠的网络协议,他在通信的两端各建立一个Socket对象,但是这两个Socket只是发送、接收数据的对象,因此对于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。

1、UDP发送数据

发送数据步骤

(1)创建发送端的Socket对象(DatagramSocket)

(2)创建数据,并把数据打包

(3)调用DatagramSocket对象的方法发送数据

(4)关闭发送端

public class Demo2 {
   public static void main(String[] args) throws IOException {
    //(1)创建发送端的Socket对象(DatagramSocket)
    DatagramSocket ds= new DatagramSocket();
    //(2)创建数据,并把数据打包
    // DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    // 构造一个数据包发送长度length的数据包到指定主机上的指定端口号
    byte[] bys= "helloworld,你好!".getBytes();//数据包
 //   写法一
//    int length = bys.length;//长度length
//    InetAddress address=InetAddress.getByName("172.20.80.131");//主机
//    int port=10086;//端口号
//    DatagramPacket dp=new DatagramPacket(bys,length,address,port);
 DatagramPacket dp=new DatagramPacket(bys,bys.length,InetAddress.getByName("172.20.80.131"),10086);//写法二
    //(3)调用DatagramSocket对象的方法发送数据
    ds.send(dp);//发送数据报包
    //(4)关闭发送端
    ds.close();
  }
}

2、UDP接收数据

接收数据的步骤

(1)创建接收端的Socket对象(DatagramSocket)

(2)创建一个数据包,用于接收数据

(3)调用DatagramSocket对象的方法接收数据

(4)解析数据包,并把数据在控制台显示

(5)关闭接收端

public class Demo2 {
   public static void main(String[] args) throws IOException {
     //(1)创建接收端的Socket对象(DatagramSocket)
     //DatagramSocket(int port)指定一个端口
     DatagramSocket ds=new DatagramSocket(10086);
     //(2)创建一个数据包,用于接收数据
     // DatagramPacket(byte[] buf,int length)接收数据包
      byte[] bys=new byte[1024] ;
      DatagramPacket dp = new DatagramPacket(bys,bys.length);
      //(3)调用DatagramSocket对象的方法接收数据
      ds.receive(dp);
      //(4)解析数据包,并把数据在控制台显示
      //byte[] data = dp.getData();//数据缓冲区
      //int len =dp.getLength();//实际数据长度
      //String dataString = new String(data,0,len);
      //System.out.println("数据是:"+dataString);
      System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
      //(5)关闭接收端
      ds.close();
  }
}

三、TCP通信程序

1、TCP通信原理

TCP 通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路。

一旦建立了虚拟网络链路,两端的程序就可以通过虚拟链路进行通信

Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生io流来进行网络通信。

2、TCP发送数据

发送数据步骤

(1)创建客户端的Socket对象(Socket)

(2)获取输出流,写数据

(3)释放资源

public class Demo2 {
   public static void main(String[] args) throws IOException {
   //(1)创建客户端的Socket对象(Socket)
     //Socket(InetAddress address,int port);
//     Socket sc=new Socket(InetAddress.getByName("172.20.80.131"),10086);
     //Socket(String host,int port);
      Socket sc=new Socket("172.20.80.131",10086);
      //(2)获取输出流,写数据
       OutputStream os = sc.getOutputStream();
       os.write("hello,你好!".getBytes());
       //(3)释放资源
       sc.close();
  }
}

3、TCP接收数据

接收数据的步骤

(1)创建服务器端的Socket对象(ServerSocket)

(2)监听客户端,返回Socket对象

(3)获取输入流,读数据,并把数据显示在控制台

(4)释放资源

public class Demo2 {
   public static void main(String[] args) throws IOException {
      //(1)创建服务器端的Socket对象(ServerSocket)
       ServerSocket ss=new ServerSocket(10086);//指定端口
       //(2)监听客户端,返回Socket对象
       Socket s=ss.accept();//侦听要连接到此套接字并接受他
       //(3)获取输入流,读数据,并把数据显示在控制台
       InputStream is=s.getInputStream();
       byte[] bys=new byte[1024];
//       int len = is.read(bys);
//       String data=new String(bys,0,len);
//       System.out.println("数据是:"+data);
       System.out.println("数据是:"+new String (bys,0,is.read(bys)));
       //(4)释放资源
       s.close();
       ss.close();
  }
}

练习

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {//客户端
   public static void main(String[] args) throws IOException {
       //创建客户端
       Socket s=new Socket("172.20.80.131",10086);
       //获取输出流,写入数据
       OutputStream os = s.getOutputStream();
       os.write("hello".getBytes());
       //接收服务端反馈
       InputStream is = s.getInputStream();
       byte[] bys=new byte[1024];
       System.out.println("客户端:"+new String(bys,0,is.read(bys)));
       //释放资源
       s.close();
   }
}


=======================================================================================

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server{//服务器端
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象
        ServerSocket ss=new ServerSocket(10086);
        //监听客户端,返回Socket对象
        Socket s=ss.accept();
        //获取输入流,读数据,并输出到控制台
        InputStream is = s.getInputStream();
        byte [] bys=new byte[1024];
        System.out.println("服务器:"+new String(bys,0,is.read(bys)));
        //给反馈
        OutputStream os = s.getOutputStream();
        os.write("数据已收到".getBytes());
        //释放资源
        s.close();
        ss.close();
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到