Java网络通信实现

news2024/11/16 4:38:20

UDP

UDPServer

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("UdpServer启动");
        // 创建upd套接字
        DatagramSocket socket = new DatagramSocket(8080);
        // 获取客户端连接
        byte[] buffer = new byte[1024];
        while (true) {
            // 获取客户端请求
            DatagramPacket client = new DatagramPacket(buffer, buffer.length);
            socket.receive(client);
            String request = new String(client.getData(), 0, client.getLength());
            // 回显客户端
            String response = request;
            socket.send(new DatagramPacket(response.getBytes(), response.getBytes().length,
                    client.getAddress(), client.getPort()));
            // 打印交互日志
            System.out.printf("客户端[%s:%d] receive-> %s send-> %s\n", client.getAddress().toString(),
                    client.getPort(), request, response);
        }
    }
}

UDPClient

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UDPClient {
    public static void main(String[] args) throws IOException {
        System.out.println("UdpClient启动");
        // 创建客户端套接字
        DatagramSocket socket = new DatagramSocket();
        // 创建数据报
        byte[] buffer = new byte[1024];
        DatagramPacket client = new DatagramPacket(buffer, buffer.length,
                InetAddress.getByName("127.0.0.1"), 8080);
        while (true) {
            // 获取发送数据
            System.out.print("send -> ");
            Scanner scanner = new Scanner(System.in);
            String request = scanner.next();
            client.setData(request.getBytes());
            // 发送数据
            socket.send(client);
            // 获取服务器回显数据
            DatagramPacket server = new DatagramPacket(buffer, buffer.length);
            socket.receive(server);
            // 打印交互日志
            System.out.printf("receive ->[%s:%d] %s\n", server.getAddress().toString(), server.getPort(),
                    new String(server.getData(), 0, server.getLength()));
        }
    }
}

测试结果

TCP

TCPServer

import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("TCPServer启动");
        // 创建监听套接字
        ServerSocket listenSocket = new ServerSocket(8080, 20, InetAddress.getByName("127.0.0.1"));
        // 创建线程池处理客户端数据
        ExecutorService clientPool = Executors.newCachedThreadPool();
        while (true) {
            // 获取客户端连接
            Socket client = listenSocket.accept();
            // 客户端处理
            clientPool.submit(() -> {
                try {
                    clientProcess(client);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    public static void clientProcess(Socket client) throws IOException {
        System.out.printf("client[%s:%d] connect success\n",
                client.getInetAddress().toString(), client.getPort());
        // 处理客户端数据
        try (Scanner input = new Scanner(client.getInputStream());
             PrintStream output = new PrintStream(client.getOutputStream())) {
            while (true) {
                if (!input.hasNext()) {
                    System.out.printf("client[%s:%d] disconnect\n",
                            client.getInetAddress().toString(), client.getPort());
                } else {
                    // 约定以\n为一个完整报文
                    String request = input.nextLine();
                    // 回显客户端
                    String response = request;
                    output.println(response);
                    output.flush();
                    // 打印交互日志
                    System.out.printf("client[%s:%d] receive -> %s send -> %s\n",
                            client.getInetAddress().toString(), client.getPort(), request, response);
                }
            }
        }
    }
}

TCPClient

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        System.out.println("TCPClient启动");
        // 创建客户端连接
        Socket socket = new Socket("127.0.0.1", 8080);
        Scanner scanner = new Scanner(System.in);
        try (Scanner input = new Scanner(socket.getInputStream());
             PrintStream output = new PrintStream(socket.getOutputStream())) {
            while (true) {
                System.out.print("send -> ");
                String request = scanner.nextLine();
                // 发送请求数据
                output.println(request);
                // 获取服务器回显数据
                String response = input.nextLine();
                // 打印交互日志
                System.out.printf("receive -> server[%s:%d] %s\n",
                        socket.getInetAddress().toString(), socket.getPort(), response);
            }

        }
    }
}

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1809683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PE文件(七)扩大节合并节数据目录

添加shellcode有以下几种的方式: 1.直接在任意节的空白区添加代码 2.新增节添加代码 3.扩大最后一个节添加代码 4.合并节并添加代码 今天我们学习如何扩大节,合并节 扩大节 在上一节的学习中,我们可以通过上移NT头和节表覆盖DOS Stub以…

VBA即用型代码手册:删除重复行Delete Duplicate Rows

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

【python】python化妆品销售logistic逻辑回归预测分析可视化(源码+课程论文+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

基于51单片机的车辆动态称重系统设计

一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…

按键精灵在Win11中弹窗出现乱码并且自带的部分系统插件不能使用的解决方法

按键精灵中出现以下问题: 提示信息的弹窗出现乱码: 系统自带的部分像 plugin. 开头的插件不能使用,如下:s Plugin.Sys.GetDateTime() screenX Plugin.GetSysInfo.GetScreenResolutionX screenY Plugin.GetSysInfo.GetScreenRe…

线程知识点总结

Java线程是Java并发编程中的核心概念之一,它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结: 1. 线程的创建与启动 继承Thread类:创建一个新的类继承Thread类,并重写其run()方法。通过创建该类的实例并调用st…

【C语言】插入排序(经典算法,建议收藏!!!)

目录 1、原理2、代码展示3、解析代码4、适用场景 1、原理 插入排序(Insertion Sort)是一种简单直观的排序算法,其原理可以简述如下: 1.分已排序区间和未排序区间: 将数组分为已排序区间和未排序区间。初始时,已排序区…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法,然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 I…

Python 潮流周刊#55:分享 9 个高质量的技术类信息源!

大家好,我是猫哥,今天给大家分享几个高质量的技术类信息源。 本文分享的信息源都是周刊类型的,所谓周刊类,就是以固定每周的频率更新,每期分享很多精华内容的链接。它的特点是信息密度极高,可以节省你去查…

log4j日志打印导致OOM问题

一、背景 某天压测,QPS压到一定值后机器就开始重启,出现OOM,好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地,打开Java sdk bin目录下的jvisualvm工具&a…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗? L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

BarTender 常见的使用要点

BarTender 简述 BarTender是由美国海鸥科技(Seagull Scientific)推出的一款条码打印软件,被广泛应用于标签、条形码、证卡和RFID标记的设计和打印领域。它在全球范围内拥有众多用户,被公认为标签打印方面的全球领先者。BarTender…

把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)

FolkMQ (消息中间件)支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版,就相当于 H2 或 SQLite 数据库一样。给一些小项目(或者特别需求)带来了方便。大项目,则可以使用独立部署的 “单机版” 或 “…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

24.6.9( 概率dp)

星期一: abc356 D atc传送门 思路:按位与操作,M的非零位对答案一定没有贡献,对M为1的位,考虑有多少k此位也为1 按位枚举,m此位为0跳…

CAS Server Restful接口实现后台认证

背景 对于一些比较复杂定制化登录页的情况下,之前提到过可以自定义修改使用CAS Server提供的登录页这种操作已经明显跟不上复杂定制场景了,所以CAS Server也提供了支持Restful接口,支持服务端后台登陆,对于复杂登陆场景时&#x…

vscode 访问容器的方式

方法一:先连服务器,再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B,再连接容器C 配置vscode的ssh配置文件:~.ssh\config(当需要多个不同的连接时,使用 IdentityFile 指定公钥位置)…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序,输入总数量及摇号需求,进行随机性摇号,并对摇取的号码进行双重随机性数据检测,确定是否符合要求。程序已调通,可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…