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协议
传输可靠性面向连接、可靠传输数据无连接、不可靠传输数据
连接方式三次握手连接方式无连接方式
传输效率传输效率较低传输效率较高
数据包大小数据包大小不固定数据包大小固定
应用场景适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等
错误检测支持错误检测和重传机制不支持错误检测和重传机制
拥塞控制有拥塞控制机制,能够避免网络拥塞没有拥塞控制机制,可能导致网络拥塞
数据顺序保证数据传输顺序不保证数据传输顺序
连接数量连接数量受限于系统内存和处理器能力连接数量受限于系统内存和处理器能力
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江 流 儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值