Socket套接字(UDP数据报)篇

这篇具有很好参考价值的文章主要介绍了Socket套接字(UDP数据报)篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元.
基于Socket套接字的网络程序开发就是网络编程.

数据报套接字

使用的是UDP(User Datagram Protocol)协议,传输层协议.

  • 无连接
  • 不可靠传输
  • 面向数据报
  • 全双工

对于UDP协议来说,具有无连接,面向数据报的特征,每次都是没有建立连接,并且一次性发送全部数据报,并一次性接收全部数据报.
java使用UDP协议通信,基于DatagramSocket类创建数据报套接字,并使用DatagramPacket作为发送或接收的UDP数据报.

DatagramSocket

DatagramSocket是UDP Socket,用于发送和接收UDP数据报.

DatagramSocket构造方法:

方法签名 方法说明
DatagramSocket() 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到指定端口(一般用于服务器端)

DatagramSocket方法:

方法签名 方法说明
void receive(DatagramSocket p) 就收套接字数据报,没有则会阻塞等待
void send(DatagramSocket p) 发送套接字数据报
void close() 关闭数据报套接字

DatagramPacket

DatagramPacket是UDP Socket发送和接受的数据报

DatagramPacket构造方法:

方法签名 方法说明
DatagramPacket(byte[] buf, int length) 这是接收数据报,接收的数据保存在byte数组中,指定接收长度
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 这是发送数据报,发送的数据时字节数组,从0到指定长度,address指定目的主机的IP和端口号

DatagramPacket方法:

方法签名 方法说明
InetAddress getAddress() 从接受的数据报中,获取发送端主机IP地址.或者从发送的数据报中,获取接收端主机的IP地址
int getPort() 从接受的数据报中,获取发送端主机的端口号.或者从发送的数据报中,获取接收端主机的端口号
byte[] getData() 获取数据报中的数据

InetSocketAddress

InetSocketAddress(SocketAddress的子类) 构造方法:

方法签名 方法说明
InetSocketAddress(InetAddress addr, int port) 创建一个Socket地址,包含IP地址和端口号

下面写一个回显服务器案例供参考:

// 服务器
public class UdpEchoServer {
    private 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(),0,response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            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 server = new UdpEchoServer(999);
        server.start();
    }
    
}

相信仔细看完的小伙伴注意到了,socket对象并没有调用close来关闭,因为此时整个程序
只有一个socket,这个对象的生命周期非常长,是跟随整个程序的.
socket对象->系统中的socket文件->文件描述符
进程结束,就把pcb回收了,文件描述符也随之销毁了.
但是如果有多个socket对象,需要频繁创建释放,一定要去进行close操作.

// 客户端
public class UDPEchoClient {
    private DatagramSocket socket = null;

    private String serverIp;
    private int serverPort;

    public UDPEchoClient(String ip, int port) throws SocketException {
        this.serverIp = ip;
        this.serverPort = port;
        // 随机端口号
        socket = new DatagramSocket();
    }

    // 让客户端反复地读取控制台内容,把内容构造成UDP请求,发给服务器
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("客户端启动");
        while (true) {
            // 1.从控制台输入
            System.out.println("-> ");
            String request = scanner.nextLine();
            // 2.构造请求对象,发给服务器
            // 使用InetAddress的静态方法,getByName来进行构造(工厂模式)
            // InetAddress.getByName(serverIp),serverPort): 要发送的ip和端口
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            // 3.客户端读取响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(responsePacket);
            String response = new String(responsePacket.getData(),0, responsePacket.getLength());
            // 4. 显示到屏幕上
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
    	// 端口号和服务器端一致
        UDPEchoClient client = new UDPEchoClient("127.0.0.1", 999);
        client.start();
    }
}

Socket套接字(UDP数据报)篇,java,学习,intellij-idea

小结

本次总结了UDP套接字数据报的相关内容,TCP套接字放到下一章博客中.
希望有收获的小伙伴多多支持.文章来源地址https://www.toymoban.com/news/detail-861763.html

到了这里,关于Socket套接字(UDP数据报)篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程『socket套接字 ‖ 简易UDP网络程序』

    🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 在当今数字化时代,网络通信作为连接世界的桥梁,成为计算机科学领域中至关重要的一部分。理解网络编程是每一位程序员必备的技能之一,而掌握套接字编程则

    2024年02月04日
    浏览(22)
  • 【网络】socket——预备知识 | 套接字 | UDP网络通信

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 在前面本喵对网络的整体轮廓做了一个大概的介绍,比如分层,协议等等内容,现在我们直接进入socket(套接字)编程,先来感受到网络编程。 我们知道,在网络通信中,存在两套地址,一

    2024年02月13日
    浏览(27)
  • Socket套接字编程(实现TCP和UDP的通信)

      🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔 🦾🦾🦾 目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿 谢谢

    2024年02月03日
    浏览(46)
  • C语言 进程通讯 socket套接字(TCP/UDP)示例

    主机字节序(host-byte):指处理器存储数据的字节顺序,分两种         大端存储(big-endian):低地址存储数据高位(符合书写规则),由ARM、Motorola等采用         小端存储(little-endian):低地址存储数据低位(将数据不重要的部分保存在低地址,重要的部分保存在高地

    2024年02月05日
    浏览(27)
  • 【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序

    我们把数据从A主机发送到B主机,是目的吗?不是,真正通信的不是这两个机器!其实是这两台机器上面的软件(人) 数据有 IP(公网) 标识一台唯一的主机 ,用谁来标识各自主机上客户或者服务进程的唯一性呢? 为了更好的表示一台主机上服务进程的唯一性,我们采用 端口号

    2024年02月12日
    浏览(27)
  • python3套接字编程之socket和socketserver(TCP和UDP通信)

    socket和socketserver是python3中socket通信模块,关于其使用做如下总结。 目录 1.socket 1.1模块引入 1.2套接字获取 1.3套接字接口 1.3.1 服务端 1.3.2 客户端套接字函数 1.3.3 公共套接字函数 1.3.4 面向锁的套接字方法 1.3.5 面向文件的套接字的函数 2.socketserver 3.TCP 3.1 socket类型TCP 3.2 sockets

    2024年02月15日
    浏览(31)
  • Java 网络编程 —— 基于 UDP 的数据报和套接字

    UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,比 TCP 具有更快的传输速度,但是不可靠。UDP 发送的数据单元被称为 UDP 数据报,当网络传输 UDP 数据报时,无法保证数据报一定到达目的地,也无法保证各个数据报按发送的顺序到达目的地,例如:当发送方

    2024年02月08日
    浏览(22)
  • 【socket编程】TCP服务器、UDP服务器、本地套接字【C语言代码实现】

    目录 0. 准备知识 0.1 大小端概念 0.2 网络字节序和主机字节序的转换 0.3 点分十进制串转换(IP地址转换函数) 0.4 IPV4结构体:(man 7 ip) 0.5 IPV6套接字结构体:(man 7 ipv6) 0.6 通用套接字结构体 1. 网络套接字函数 1.1 socket 1.2 connect 1.3 bind 1.4 listen 1.5 accept 1.6 端口复用 2. 包裹函

    2024年02月07日
    浏览(27)
  • 【网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

    前言: 大家好,我是 良辰丫 ,今天我们一起来学习网络编程,网络编程的基本概念,认识套接字,UDP与TCP编程.💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期待大家三连,关注

    2023年04月20日
    浏览(28)
  • UDP数据报套接字

    Socket是操作系统中的一个概念,本质上是一种特殊的文件,Socket就属于把“网卡”这个设备给抽象成了文件。往 Socket 文件中写数据,就相当于通过网卡发数据,从 Socket 文件中读数据,就相当于通过网卡接收数据。而在Java中,就使用 DatagramSocket 这个类来表示系统内部的 So

    2024年02月05日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包