• Java网络编程-Socket实现数据通信


    前言

    本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。

    网络编程三要素

    网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是:

    • IP地址和端口号
    • 传输协议
    • Socket

    IP地址和端口号

    在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的位置。IP地址由32位二进制数表示,通常采用点分十进制表示法,如192.168.1.1。

    端口号是指计算机中应用程序与网络之间进行交互时,用于标识该应用程序的一个标识符。端口号是一个16位的无符号整数,取值范围为0-65535,其中0-1023为系统保留端口号,一般用于系统服务。

    传输协议

    在互联网中,主要有两种传输协议,分别是TCP协议和UDP协议。

    TCP协议是一种可靠的面向连接的传输协议。在TCP协议中,数据传输前需要先建立连接,通过三次握手进行确认,保证数据传输的可靠性。TCP协议适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等。

    UDP协议是一种不可靠的无连接传输协议。在UDP协议中,数据在传输过程中不需要建立连接,也不需要进行数据确认。UDP协议适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等。

    Socket

    Socket是一种通信协议,可以实现不同计算机之间的网络通信。使用Socket开发网络应用程序,可以实现客户端与服务器之间的数据交换,比如网页数据、文件传输等。在Java中,可以使用Socket类实现TCP协议的Socket连接。客户端通过创建Socket对象并指定服务端的IP地址和端口号来连接服务端。服务端通过创建ServerSocket对象并监听客户端的请求,等待客户端连接。

    使用Scoket实现网络通信

    TCP

    TCP通信-发送方

    public class Client {
        public static void main(String[] args) throws IOException {
            //TCP协议,发送数据
    
            //1.创建Socket对象
            //细节:在创建对象的同时会连接服务端
            //      如果连接不上,代码会报错
            Socket socket = new Socket("127.0.0.1",10000);
    
            //2.可以从连接通道中获取输出流
            OutputStream os = socket.getOutputStream();
            //写出数据
            os.write("aaa".getBytes());
    
            //3.释放资源
            os.close();
            socket.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    TCP通信-接收方

    public class Server {
        public static void main(String[] args) throws IOException {
            //TCP协议,接收数据
    
            //1.创建对象ServerSocker
            ServerSocket ss = new ServerSocket(10000);
    
            //2.监听客户端的链接
            Socket socket = ss.accept();
    
            //3.从连接通道中获取输入流读取数据
            InputStream is = socket.getInputStream();
            int b;
            while ((b = is.read()) != -1){
                System.out.println((char) b);
            }
    
            //4.释放资源
            socket.close();
            ss.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    结果

    在这里插入图片描述

    UDP

    UDP通信-发送方

    package com.utils;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * @BelongsProject: CSDN_score
     * @BelongsPackage: com.utils
     * @Author:qiutianshuo
     * @Description:
     * @CreateTime: 2023-09-01 11:24
     * @Version: 1.0
     */
    public class SendDemo {
        public static void main(String[] args) throws IOException {
            //创建发送端的Socket对象(DatagramSocket)
            // DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
            DatagramSocket ds = new DatagramSocket();
    
            //创建数据,并把数据打包
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            //构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
            byte[] bys = "hello,udp,我来了".getBytes();
    
            DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);
    
            //调用DatagramSocket对象的方法发送数据
            //void send(DatagramPacket p) 从此套接字发送数据报包
            ds.send(dp);
    
            //关闭发送端
            //void close() 关闭此数据报套接字
            ds.close();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    UDP通信-接收方

    package com.utils;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class ReceiveMessageDemo {
        public static void main(String[] args) throws IOException {
            //接收数据
    
    
    
            //1.创建DatagramSocket对象(快递公司)
            //细节:
            //在接收的时候,一定要绑定端口
            //而且绑定的端口一定要跟发送的端口保持一致
            DatagramSocket ds = new DatagramSocket(10086);
    
    
            //2.接收数据包
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
    
    
            //该方法是阻塞的
            //程序执行到这一步的时候,会在这里死等
            //等发送端发送消息
            System.out.println(11111);
            ds.receive(dp);
            System.out.println(2222);
    
    
            //3.解析数据包
            byte[] data = dp.getData();
            int len = dp.getLength();
            InetAddress address = dp.getAddress();
            int port = dp.getPort();
    
            System.out.println("接收到数据" + new String(data,0,len));
            System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
    
            //4.释放资源
            ds.close();
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    结果

    在这里插入图片描述

    总结

    网络编程是现代计算机技术中非常重要的一部分,上述三要素是网络编程的基础。要实现网络编程,需要了解IP地址和端口号的概念和使用,掌握TCP协议和UDP协议的特点和使用,以及掌握Socket编程相关知识和技能。同时在实现过程中也需要注意安全性问题,例如加密数据传输、防止数据篡改等。

    维度TCP协议UDP协议
    传输可靠性面向连接、可靠传输数据无连接、不可靠传输数据
    连接方式三次握手连接方式无连接方式
    传输效率传输效率较低传输效率较高
    数据包大小数据包大小不固定数据包大小固定
    应用场景适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等
    错误检测支持错误检测和重传机制不支持错误检测和重传机制
    拥塞控制有拥塞控制机制,能够避免网络拥塞没有拥塞控制机制,可能导致网络拥塞
    数据顺序保证数据传输顺序不保证数据传输顺序
    连接数量连接数量受限于系统内存和处理器能力连接数量受限于系统内存和处理器能力
  • 相关阅读:
    【软键盘】Android开发之隐藏软键盘的方式
    vue中数组常用的六种循环方法、VUE中list的各种方法和运用
    伪代码实现几种常见的时间复杂度算法
    使用 python 检测泛洪攻击的案例
    Datax从mysql同步数据到mysql
    PowerBI工作区连接Log Aanlytics
    cmd 与 npm是干什么的?为什么要使用npm?
    制作一个简单HTML静态网页(HTML+CSS)
    javax.validation.constraints校验
    Cordova系列之化繁为简:打造全场景适用的Cordova组件
  • 原文地址:https://blog.csdn.net/aqiuisme/article/details/132640203