网络编程

JAVA(网络编程)

一,网络编程

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,

在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程

  • 网络结构:局域网,城域网,广域网
  • 结构:C/S (Client/Server) 客户端/服务器
  •           B/S     浏览器/服务器

 

网络编程三要素

1.ip地址

要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识

号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备

的标识

2.端口

网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网

络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口

号就可以唯一标识设备中的应用程序了。也就是应用程序的标识

3.协议

通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通

信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算

机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、

传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协

议和TCP协议

 

IP地址

IPv4:

是给每个连接在网络上的主机分配一个32bit地址。按照TCP/IP规定,IP地址用二

进制来表示,每个IP地址长32bit,也就是4个字节。例如一个采用二进制形式的IP地址

是“11000000 10101000 00000001 01000010”,这么长的地址,处理起来也太费劲

了。为了方便使用,IP地址经常被写成十进制的形式,中间使用符号“.”分隔不同的字

节。于是,上面的IP地址可以表示为“192.168.1.66”。IP地址的这种表示法叫做“点分十

进制表示法”,这显然比1和0容易记忆得多

IPv6

由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得

IP的分配越发紧张。为了扩大地址空间,通过IPv6重新定义地址空间,采用128位地址长

度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题

DOS常用命令

  • ipconfig:查看本机地址
  • ping IP地址:检查网络是否连通

特殊地址

  127.0.0.1:回送地址,也是本机地址

 

端口

端口

设备上的唯一标识

端口号

用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一

些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被

另外一个服务或应用所占用,会导致当前程序启动失败

 

案例

//获取本机地址
InetAddress ia = InteAddress.getLocalHost();
System.out.print(ia.toString());
System.out.println(ia.getHostName());
System.out.println(ia.getHostAddress());

//获取地址域名
InetAddress ia1=InetAddress.getByName("www.bilibili.com");
System.out.print(ia1.toString());
System.out.println(ia1.getHostName());
System.out.println(ia1.getHostAddress());

//端口号
InetSocketAddress isa=new InetSocketAddress("www.jladi.com",8080);
System.out.print(isa.toString());
System.out.println(isa.getHostName());
System.out.println(isa.getHostAddress());

 

协议

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

OSI七层协议

 

UDP协议

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

UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简

单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存

在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

优点:

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据

的传输

缺点:

例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对

接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,

不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议

 

UDP案例

public class SendDemo { 
    public static void main(String[] args)throws IOException {
//创建发送端Socket对象(DatagramSocet)
    DatagramSocket socket =new DatagramSocket();
//创建要发送数据
     byte[] bys="hello,UDP,我来了".getBytes();
//创建数据,并把数据打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int po
//构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    DatagramPacket dp=new DatagramPacket(bys,bys.length,
                                         InetAddress.getByName("127.0.0.1"),
                                             12345);
     socket.send(dp);
     socket.close();
     }
 }
public class ReceiveDemo { 
    public static void main(String[] args) throws IOException {
//接收端和发送端端口号必须一致
    DatagramSocket ds=new DatagramSocket(12345);
    while (true){
//创建一个数据包
    byte[] bys=new byte[1024];
    DatagramPacket dp=new DatagramPacket(bys,bys.length);
//调用DatagramSocket对象方法接收
    ds.receive(dp);
//解析数据包,并把数据在控制台显示输出
    System.out.println("数据是:"+new String(dp.getData()));
    }
    }
 }

 

TCP协议

传输控制协议 (Transmission Control Protocol)

TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,

它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服

务器端,客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

三次握手

TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

  • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认
  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接

 

面试题:TCP三次握手

 

1). 第一次握手,客户端发送syn(SYN 同步序列编号)包到服务器端,客户端进入syn_send

状态,等待服务器端确认。

2). 第二次握手,服务器端向客户端回送一个 SYN+ACK包 ACK (Acknowledge

character)即是确认字符,服务器端进入syn_recv状态

3). 第三次握手,客户端再次向服务器端发送确认信息,确认连接 ACK 包,至此客户

端和服务器端进入established状态。

4握手过程中传送的包不包含任何数据,连接建立后才会开始传送数据,理想状态下,

TCP连接一旦建立,在通信双方的任何一方主动关闭连接前,TCP连接都会一直保持下

去。

 

面试题: 为什么TCP握手需要三次?

TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。

如果TCP握手二次:

客户端发送syn,进入到closeed状态,服务端一直等待,这样浪费了服务器端资源。

如果TCP握手四次:

  1. client给 server发送SYN同步报文;
  2. server收到SYN后,给 client回复ACK确认报文;
  3. server给 client发送SYN同步报文;
  4. client给 server发送ACK确认报文。

相当于服务器多发了一次TCP报文,降低了连接速度和效率。

 

四次挥手:

1) 第一次挥手,TCP客户端发送一个FIN报文,用来关闭客户到服务器的数据传送。告诉对方不发数据

2)第二次挥手,服务器收到这个FIN报文,它发回一个ACK报文,确认序号为收到的序号加1

3) 第三次挥手、服务器关闭客户端的连接,告诉对方我也不给你发数据了,发送一个FIN报文给客户端。

4)第四次挥手: 主动关闭方客户端发回ACK报文确认,并将确认序号设置为收到序号加1。完成四次挥手。

 

面试题:为什么TCP挥手需要四次?

因为TCP连接是全双工的网络协议,允许同时通信的双方同时进行数据的收发,同样也允许收发两个方向的连接被独立关闭,关闭TCP连接需要进行四次连接,每次关闭一个方向上的连接需要FIN和ACK两次握手。

 

面试题:TCP和UDP的区别

TCP和UDP都属于传输层协议,它们之间的区别在于

  • TCP是面向连接的;UDP是无连接的。
  • TCP是可靠的;UDP是不可靠的
  • TCP只支持点对点通信;UDP支持一对一、一对多、多对一、多对多的通信模式。
  • TCP是面向字节流的;UDP是面向报文的。
  • TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信。
  • TCP首部开销(20个字节),比UDP的首部开销(8个字节)要大。

 

JAVA中的TCP通信

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

Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

 

案例1:

public class Test1 {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器端启动,等待连接.....");
        //创建一个服务器对象,绑定8888端口
        ServerSocket serverSocket = new ServerSocket(8888);

        //服务器在等待客户端连接
        System.out.println("服务器已启动....");
        Socket accept = serverSocket.accept();

//        System.out.println(accept);

        //读取客户端发来的信息
        InputStream inputStream = accept.getInputStream();
        byte [] buffer = new byte[1024*1024];
        int len;
        while ((len = inputStream.read(buffer)) != -1){
            System.out.println(new String(buffer,0,len));
        }

        //释放资源
        inputStream.close();
//        serverSocket.close();
        accept.close();

    }

    @Test
    public void client() throws IOException {
        System.out.println("客户端发送数据");
        //创建了一个Socket通信的ip地址
        Socket socket = new Socket();

        //第一个参数获取当前主机的ip地址,
        //第二个服务器的端口号
        socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
//        System.out.println("客户端已连接");

        //客户端发送信xi
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("123".getBytes());

        System.out.println("客户端以发送信息");

        //释放资源
        outputStream.close();
        socket.close();


    }
}

 

案例2:

public class Demo {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        //等待客户端连接
        Socket accept = serverSocket.accept();
        //获取一个输入读取客户端发送的数据
        InputStream inputStream = accept.getInputStream();
        byte [] buf = new byte[1024];
        int len;
        while ((len = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,len));
        }



        inputStream.close();
        serverSocket.close();

    }

    //响应
    @Test
    public void Servers() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        Socket socket = serverSocket.accept();
        OutputStream outputStream = socket.getOutputStream();

        //按照http协议封装一个报文数据
        String response = "HTTP/1.1 200 OK\r\n"//服务器告诉浏览器,请求成功
                + "Content-Length:39\r\n" +//第二行第三行,服务器告诉浏览器,我们这个响应的类型是HTML,长度39字符
                "Content-Type:text/html;charset=UTF-8\r\n\r\n" +
                "<h1>12 3fSDg飞洒发士大夫十大高手大哥</h1>";//最后一行,具体的网页数据
        outputStream.write(response.getBytes());
        outputStream.flush();
        // 这个流不要着急关,突然的关闭会导致浏览器和服务器断开连接
    }

    //重定向:重新定位到新的地址栏
    @Test
    public void Servers1() throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        Socket socket = serverSocket.accept();
        OutputStream outputStream = socket.getOutputStream();

        //按照http协议封装一个报文数据
        String response = "HTTP/1.1 302 Moved Temporarily\r\n" +
                "Location:http://www.bilibili.com\r\n\r\n";
        outputStream.write(response.getBytes());
        outputStream.flush();
        // 这个流不要着急关,突然的关闭会导致浏览器和服务器断开连接
    }
}

 

面试题:

用户在浏览器输入一个URL并回车,这个过程涉及到哪些网络协议

浏览器输入一个URL并回车:

  1. 首先进行域名解析,浏览器搜索自己的DNS缓存,缓存中维护一张域名与IP地址的对应表。

若没有,则搜索操作系统的DNS缓存;若没有,则将域名发送至本地域名服务器(递归査询

方式),本地域名服务器査询自己的DNS缓存,查找成功则返回结果,否则,本地的DNS服

务器向根域名服务器发出查询请求,根域名服务器告知该域名的级域名服务器,然后本地服

务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服

务器是基于UDP的,因此会用到UDP协议。

  1. 得到IP地址以后,浏览器就要与服务器建立一个HTTP连接,因此要用到HTTP协议。HTTP

生成一个GET请求报文。

  1. 接下来到了传输层,选择传输协议,TCP或者UDP,TCP是可靠的传输控制协议,对HTP请

求进行封装,加入了端口号等信息。

  1. 然后到了网络层,通过IP协议将IP地址封装为IP数据报;然后此时会用到ARP协议,主机发

送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确

定目标的物理地址,找到目的MAC地址。

  1. 接下来到了数据链路层,把网络层交下来的IP数据报添加首部和尾部,封装为MAC帧,现在

根据目的mac开始建立TCP连接,三次握手,接收端在收到物理层上交的比特流后,根据首

尾的标记,识别帧的开始和结束,将中间的数据部分上交给网络层,然后层层向上传递到应

用层

  1. 服务器响应请求并请求客户端要的资源,传回给客户端。
  2. 断开TCP连接,浏览器对页面进行渲染呈现给客户端。

 

posted @   一只神秘的猫  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示