网络编程入门笔记(一)

news/2024/5/18 14:00:52 标签: tcp, udp

网络通信协议

目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protocal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocal)协议和其它一些协议的协议组

TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。

链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。

运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。

应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等

IP地址和端口号

在TCP/IP协议中要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号就是IP地址

IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示。通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开

想访问目标计算机中的某个应用程序,还需要指定端口号

UDP协议

UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接,不能保证数据的完整性

UDP协议特点:
                1).数据需要打包发送;
                2).数据包的大小有限制--64k
                3).发送时可以没有接收端,所以被称为不安全的协议。
                    例如:共屏软件、视频会议...

TCP协议

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

第一次握手,客户端向服务器端发出连接请求,等待服务器确认,

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

第三次握手,客户端再次向服务器端发送确认信息,确认连接

TCP协议特点:
                1).数据不需要打包;
                2).数据大小无限制;
                3).发送时必须要有接收端,所以被称为安全的协议。
                    例如:文件上传,点对点聊天

  1. (UDP协议发送数据)
        public static void main(String[] args) throws IOException {
            //1.创建一个DatagramSocket对象
            DatagramSocket socket = new DatagramSocket();
            //2.准备数据:
            InetAddress ip = InetAddress.getByName("127.0.0.1");//目标IP
            int port = 8888;//目标端口
            byte[] data = "你好,吃了吗?".getBytes();//信息内容
            // 3.准备一个"数据包"对象:DatagramPacket,将上面准备的传给数据包对象;
            DatagramPacket pck = new DatagramPacket(data,        //信息的byte[]数组
                            data.length,        //信息长度
                            ip,            //目标IP
                            port);            //目标端口
            
            //4.调用DatagramSocket对象的send()发送"数据包"
            socket.send(pck);
            
            //5.关闭连接
            socket.close();
            System.out.println("发送完毕!");
            
        }
  2. (UDP协议接收数据)
        public static void main(String[] args) throws IOException {
            //1.创建一个DatagramSocket(int 本机监听端口)对象
            DatagramSocket socket = new DatagramSocket(8888);
            //2.创建一个空的byte[]数组,准备接收信息;
            byte[] byteArray = new byte[1024];
            //3.创建一个空的数据包对象(DatagramPacket),将byte[]数组传给它。
            DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);
            //4.4.使用socket对象的receive()接收数据,
            System.out.println("等待数据...");
            socket.receive(pck);//注意:程序将会在这里被阻塞
            System.out.println("有数据到达...");
            
            //5.解析数据包,获取数据。
            byte[] data = pck.getData();
            String s = new String(data,0,pck.getLength());
            System.out.println("接收到信息:" + s);
            
            // 6.关闭连接
            socket.close();
        }
  3. TCP通信首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信
  4. (TCP协议发送数据)
        public static void main(String[] args) throws IOException {
            //1.创建一个Socket(String 目标IP,int 目标端口)对象。
            Socket socket = new Socket("127.0.0.1",8888);
            //2.由于要发送数据,所以要从Socket中获取一个"输出流--OutputStream"。
            OutputStream out = socket.getOutputStream();
            //3.使用输出流输出数据;
            out.write("你好,吃的啥?".getBytes());
            //4.关闭连接
            socket.close();
            
            System.out.println("客户端发送完毕!");
        }       

  5. (TCP协议接收数据)
        public static void main(String[] args) throws IOException {
            //1.创建一个ServerSocket(int 本机监听端口)对象
            ServerSocket server = new ServerSocket(8888);
            //2.等待连接,如果有客户端连接成功,会产生一个Socket对象,并继续执行;
            Socket socket = server.accept();//程序会在这里阻塞,等待客户端连接
            //3.通过Socket对象获取一个输入流。
            InputStream in = socket.getInputStream();
            //4.通过输入流读取数据;
            byte[] byteArray = new byte[1024];
            int len = in.read(byteArray);
            String s = new String(byteArray,0,len);
            System.out.println("服务器端收到信息:" + s);
            
            //5.关闭连接
            socket.close();
            server.close();
            
        }                                                                                                                                                                             


http://www.niftyadmin.cn/n/613588.html

相关文章

分布式事务学习笔记(一)

1、什么是分布式系统? 部署在不同结点上的系统通过网络交互来完成协同工作的系统。 比如:充值加积分的业务,用户在充值系统向自己的账户充钱,在积分系统中自己积分相应的增加。充值系统和积 分系统是两个不同的系统,一…

读《深入理解Java虚拟机》笔记(一)Jvm的内存区域

Jvm的内存区域图 一 程序计数器 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个技术器的值来取下一条要执行的字节码指令,分支,循环&#xff0…

JPA入门学习(二)

JPA 中的主键生成策略 1 IDENTITY:主键由数据库自动生成(主要是自动增长型) 2 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列 3 TABLE:使用一个特定的数据库表格来保存主键JPA通过创建一张表来实现&a…

读《深入理解Java虚拟机》笔记(二)Jvm的对象管理

对象的创建 虚拟机遇到一条new执行命令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类符号的引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化。如果没有那么就先必须执行相应的类加载过程,以后再讨论…

读《深入理解Java虚拟机》笔记(三)垃圾收集算法

Java内存运行时的区域中,程序计数器,虚拟机栈,本地方法栈随线程而生,线程而亡。栈中栈帧随着方法的进入和退出有条理的执行着出栈和入栈操作。随着方法结束或者线程结束时,内存自然就跟着回收了。而java堆和方法区的内…

读《深入理解Java虚拟机》笔记(四)垃圾收集器

Serial收集器:最基本,发展历史最悠久的收集器。一个单线程的收集器只会使用一个cpu或者一条线程去完成垃圾收集工作更重要的是在进行垃圾收集时,必须暂停所有的工作线程,直到它收集结束。依然是虚拟机运行在Client模式下的默认新生…

读《深入理解Java虚拟机》笔记(五)内存分配与回收策略

对象的内存分配往大的方向说,就是在堆上分配,主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按照线程优先在TLAB上分配。书上的测试使用的是Client模式虚拟机运行,也就是serial/serial old收集器下的内存分…

Dockerfile之打包到构建镜像(第一种方法)

第一步 使用maven的打包插件&#xff1a; 将下边的插件依赖拷贝到微服务工程中 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin> 第二步 maven打包 在工程目录运行…