9.2.1Socket(UDP)

news/2024/5/18 12:07:46 标签: java, udp

一.传输层:

1.UDP:无连接,不可靠,面向数据报,全双工.

2.TCP:有连接,可靠,面向字节流,全双工.

注意:这里的可不可靠是相对的,并且和安不安全无关.

二.UDP数据报套接字编程:

1.socket文件:表示网卡的这类文件.

 2.DatagramPacket:表示一个UDP数据报.

 

三.代码实现:

1.回显服务器代码:

java">import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class EchoUDPServer {
    // 服务器
    private DatagramSocket socket = null;

    public EchoUDPServer(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 = this.process(request);
            // 3.把相应写会给客户端
            // 注意第二个参数的长度
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            System.out.println(responsePacket.getSocketAddress() + "  接受内容:" + request + "  回复内容:" + response);
        }
    }

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        // 服务器端口号由自己指定(1025~65535),0~1024最好不要使用
        EchoUDPServer server = new EchoUDPServer(1999);
        //EchoUDPServer server = new DictionaryUDPServer(1999);
        server.start();
    }
}

 

2.回显客户端代码:

java">import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class EchoUDPClient {
    // 客户端
    private DatagramSocket socket = null;
    private String serverIp = null;
    private int serverPort;

    public EchoUDPClient(String serverIp, int serverPort) throws SocketException {
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("客户端启动");
        while (true) {
            System.out.println("->");
            // 1.从控制台获取用户输入
            String request = scanner.nextLine();
            // 2.构造请求对象,发送给服务器
            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 {
        EchoUDPClient client = new EchoUDPClient("127.0.0.1", 1999);
        client.start();
    }
}

3.字典服务器代码: 

 

java">import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;

public class DictionaryUDPServer extends EchoUDPServer{

    private Map<String, String> dictionary = new HashMap<>();

    public DictionaryUDPServer(int port) throws SocketException {
        super(port);
        dictionary.put("I", "我");
        dictionary.put("love", "爱");
        dictionary.put("China", "中国");
    }

    @Override
    public String process(String request) {
        return dictionary.getOrDefault(request, "没找到");
    }

    public static void main(String[] args) throws IOException {
        EchoUDPServer server = new DictionaryUDPServer(1999);
        server.start();
    }
}

四.调试问题:

同时启动多个相同的代码:

 


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

相关文章

前端导出excel,前端纯数据导出excel

非常符合前端直接的使用 使用 先看看使用 表格数据 const tableData [{"id": 1,"firstName": "John","lastName": "Doe","email": "john.doeexample.com","age": 28,"address":…

redis学习笔记(二)

文章目录 redis数据类型string&#xff08;字符串&#xff09;1. 设置键值2. 设置键值的过期时间3. 关于设置保存数据的有效期4. 设置多个键值5. 字符串拼接值6. 根据键获取值7. 自增自减8. 获取字符串的长度9. 比特流操作 redis数据类型 redis可以理解成一个全局的大字典&…

JavaWeb-Servlet服务连接器(一)

目录 1.Servlet生命周期 2.Servlet的配置 3.Servlet的常用方法 4.Servlet体系结构 5.HTTP请求报文 6.HTTP响应报文 1.Servlet生命周期 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称。其主要的功能是交互式地浏览和修改数据&#xff0c;生成一些动态…

Transformer(一)简述(注意力机制,NLP,CV通用模型)

目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed 1.5.位置信息表达 2.decorder&#xff08;待补充&#xff09; 参考文献 1.Encoder 1.1简单理解Attention 比方说&#xff0c;下图中的热度图中我们希望专注于…

解锁园区交通新模式:园区低速自动驾驶

在当今科技飞速发展的时代&#xff0c;自动驾驶技术成为了备受关注的领域之一。尤其是在园区内部交通管理方面&#xff0c;自动驾驶技术的应用正在日益受到重视。 园区低速自动驾驶的实现需要多个技术领域的协同合作&#xff0c;包括自动驾驶技术、计算机视觉技术、通信技术、物…

Redis—集群

目录标题 主从复制第一次同步命令传播分担主服务器压力增量复制总结面试题什么是Redis主从复制Redis主从复制的原理Redis主从复制的优点Redis主从复制的缺点Redis主从复制的配置步骤Redis主从复制的同步策略主从节点是长还是短连接判断某个节点是否正常工作主从复制架构中&…

链表有无环以及确定入环口详解

142.环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

使用Redis来实现点赞功能的基本思路

使用Redis来实现点赞功能是一种高效的选择&#xff0c;因为Redis是一个内存数据库&#xff0c;适用于处理高并发的数据操作。以下是一个基本的点赞功能在Redis中的设计示例&#xff1a; 假设我们有一个文章或帖子&#xff0c;用户可以对其进行点赞&#xff0c;取消点赞&#x…