自学内容网 自学内容网

【JavaEE 初阶(六)】网络编程

❣博主主页: 33的博客
▶️文章专栏分类:JavaEE◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多网络知识

在这里插入图片描述

1.前言

在日常生活中,我们处处都需要用到网络,比如我们在自己的电脑上编辑一条信息是如何发送到对方的电脑上的呢?我相信通过对网络的学习大家一定有不少的收获。

2.浅谈网络

2.1基本知识

网络的发展:单机时代-局域网时代-广域网时代-移动互联网时代
局域网:把几个电脑通过一个路由器连接到一起
广域网:把更多的局域网连接在在一起
IP地址:描述了一台设备在网络上的地址
端口号:不同程序关联了不同的端口号,一个端口号只能绑定一个程序但是一个程序可以绑定多个端口号。
协议:一种约定
五元组:源IP地址,目的IP地址,源端口号,目的端口号,协议类型
协议分层:如果搞一个大的协议来解决所有问题,那么这个协议就会非常的胖达,所以我们就进行拆分,由于通信实在太复杂,拆分出来的小协议就非常多,所以就进行了分层,约定了不同层次之间的调用关系,上层协议调用下层协议,下层协议给上层协议提供支持。

2.2.OSI与TCP/IP

OSI七层网络模型仅仅是在教科书中出现,在日常的生活中并不常见。TCP/IP五层网络协议是七层网络模型的简化版本。
在这里插入图片描述
1.物理层:描述的是通信网络的硬件设备,例如网线或者光纤。
2.数据链路层:两个相邻节点的传输情况,负责设备之间的数据帧的传送和识别。
3.网络层:进行路径规划,负责地址管理和路由选择。
4.传输层:关注起点和终点,负责两台主机之间的数据传输。
5.应用层:如何使用这个数据
注意

  • 对于一台主机,它实现了从物理层到应用层,5层
  • 对于一台路由器,它实现了物理层到网络层,3层
  • 对于一台交换机,它实现了从物理层到数据链路层,2层
    对于集线器,只实现物理层

3.网络编程

通过网络,可以让两个主机进行通信。进行网络编程的时候,需要操作系统提供API,这组API其实就是Socket API可以认为是应用层和传输层之间交互的路径。通过这组API就可以完成不同主机,不同系统之间的通信。

3.1TCP与UDP区别

传输层提供了2个协议是:TCP和UDP,那有什么区别呢?
TCP是有连接的,UDP是无连接的:TCP保存了对方信息,UDP没有保存
TCP是可靠的,UDP是不可靠的:TCP消息发出能够知道是否到达,UDP不知道。
TCP是面向字节流,UDP是面向数据报:TCP以字节为单位传输,UDP以数据报为单位进行传输
TCP和UDP都是全双工:允许双向通信

3.2UDP网路编程

让客户短发送一个请求,服务器收到请求以后返回发给客户端,再显示:
服务器:

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    DatagramSocket socket=null;
    //设置端口号
    public UdpEchoServer(int port) throws SocketException {
        socket=new DatagramSocket(port);
    }
    //启动服务器
   public void start() throws IOException {
       System.out.println("启动服务器");
       while (true){
           //1、读取请求解析
           DatagramPacket requestpacket=new DatagramPacket(new byte[4096],4096);
           socket.receive(requestpacket);
           //此时数据是以二进制的形式存放早数组中,将其以字符串形式显示
           String request=new String(requestpacket.getData(),0,requestpacket.getLength());
           //2.响应
           String response=process(request);
           //3.响应回到客户端
           DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestpacket.getSocketAddress());
           socket.send(responsePacket);
           //4.打印日志

           System.out.printf("[%s:%d] req=%s, resp=%s\n",requestpacket.getAddress().toString(),requestpacket.getPort(),request,response);
       }
   }

    private String process(String request) {
        return request;
    }
    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer=new UdpEchoServer(9090);
        udpEchoServer.start();

    }
}

客户端:

package UDP;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UdpEchoClient {
     DatagramSocket socket=null;
    String ip="";
    int port=0;
    public UdpEchoClient(String ip,int port) throws SocketException {
        socket=new DatagramSocket();
        this.ip=ip;
        this.port=port;
    }
    //客户端启动
    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
        while (true){
            System.out.println("->");
            //控制台输入数据作为请求
            String request=scanner.next();
            //发送请求
            DatagramPacket requestpacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);
            socket.send(requestpacket);
            //读取响应
            DatagramPacket responsepacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsepacket);
            //打印响应
            String response=new String(responsepacket.getData(),0,responsepacket.getLength());
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();
    }
}

3.3TCP网络编程

客户端:

package TCP;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    Socket socket=null;
    public TcpEchoClient(String IP,int port) throws IOException {
        socket=new Socket(IP,port);
    }
    //服务器启动
    public void start(){
        System.out.println("客户端启动!");
        Scanner scanner=new Scanner(System.in);
        try (InputStream inputStream=socket.getInputStream();
             OutputStream outputStream=socket.getOutputStream()) {
             PrintWriter writer=new PrintWriter(outputStream);
             Scanner scannernet=new Scanner(inputStream);
            while (true){
                System.out.println("->");
                String request=scanner.next();
                //发送请求
                writer.println(request);
                writer.flush();
                //读取响应
                String response=scannernet.next();
                //打印响应
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient=new TcpEchoClient("127.0.0.1",9090);
        tcpEchoClient.start();
    }
}

服务器:

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoServer {
    ServerSocket socket=null;
    public TcpEchoServer(int port) throws IOException {
        socket=new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true){
        Socket clientsocket= socket.accept();
        Thread t=new Thread(()->{
               processConnection(clientsocket);
       });
        t.start();
        }
    }
    private void processConnection(Socket clientsocket)  {
        //服务器启动
        System.out.printf("[%s:%d] 客户端上线\n",clientsocket.getInetAddress(),clientsocket.getPort());
            try (InputStream inputStream=clientsocket.getInputStream();
                 OutputStream outputStream=clientsocket.getOutputStream()) {
                //连接请求分析
                while (true) {
                    Scanner scanner = new Scanner(inputStream);
                    if (!scanner.hasNext()) {
                        System.out.printf("[%s:%d] 客户端下线\n", clientsocket.getInetAddress(), clientsocket.getPort());
                        break;
                    }
                    String request = scanner.next();
                    //做出响应
                    String response = process(request);
                    //发送给客户端
                    PrintWriter writer = new PrintWriter(outputStream);
                    writer.println(response);
                    writer.flush();
                    //打印以下交互过程
                    System.out.printf("[%s:%d],req=%s,rep=%s\n", clientsocket.getInetAddress(), clientsocket.getPort(), request, response);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    clientsocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
    private String process(String request) {
        return request;
    }
    public static void main(String[] args) throws IOException {
        TcpEchoServer tcpEchoServer=new TcpEchoServer(9090);
        tcpEchoServer.start();
    }
}

4.总结

本篇文章主要讲述了利用UDP和TCP进行网络编程,我们要掌握客户端与服务器的各个流程.

下期预告:网络原理


原文地址:https://blog.csdn.net/weixin_69049913/article/details/138542571

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!