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();
    }
}

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();
    }
}

结果

在这里插入图片描述

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();
    }
}


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();


    }
}

结果

在这里插入图片描述

总结

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

维度 TCP协议 UDP协议
传输可靠性 面向连接、可靠传输数据 无连接、不可靠传输数据
连接方式 三次握手连接方式 无连接方式
传输效率 传输效率较低 传输效率较高
数据包大小 数据包大小不固定 数据包大小固定
应用场景 适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等 适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等
错误检测 支持错误检测和重传机制 不支持错误检测和重传机制
拥塞控制 有拥塞控制机制,能够避免网络拥塞 没有拥塞控制机制,可能导致网络拥塞
数据顺序 保证数据传输顺序 不保证数据传输顺序
连接数量 连接数量受限于系统内存和处理器能力 连接数量受限于系统内存和处理器能力