聊天系统UDP TCP

服务端

package work;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.ArrayList;
import java.util.List;
 
public class UDPServer {
    private static final int PORT = 9876;
    private static List<ClientInfo> clients = new ArrayList<>();
 
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(PORT);
 
            System.out.println("UDP 服务器在端口上运行 " + PORT);
 
            while (true) {
                byte[] receiveData = new byte[1024];
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket.receive(receivePacket);
 
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("收到来自 " + receivePacket.getAddress() + ": " + message);
 
                // Broadcast message to all clients
                broadcastMessage(message, receivePacket.getAddress(), receivePacket.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private static void broadcastMessage(String message, java.net.InetAddress address, int port) {
        for (ClientInfo client : clients) {
            try {
                DatagramSocket clientSocket = new DatagramSocket();
                byte[] sendData = message.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, client.getAddress(), client.getPort());
                clientSocket.send(sendPacket);
                clientSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    private static class ClientInfo {
        private java.net.InetAddress address;
        private int port;
 
        public ClientInfo(java.net.InetAddress address, int port) {
            this.address = address;
            this.port = port;
        }
 
        public java.net.InetAddress getAddress() {
            return address;
        }
 
        public int getPort() {
            return port;
        }
    }
}

客服端口

package work;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
public class TCPClient {
 
    public static void main(String[] args) {
        final String serverAddress = "localhost";
        final int serverPort = 12345;
 
        try (Socket socket = new Socket(serverAddress, serverPort)) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
 
            // 从服务器接收消息并显示
            new Thread(() -> {
                try {
                    String message;
                    while ((message = reader.readLine()) != null) {
                        System.out.println("服务器: " + message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
 
            // 从控制台读取输入并发送给服务器
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            String consoleInput;
            while ((consoleInput = consoleReader.readLine()) != null) {
                writer.println(consoleInput);
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 结果:

UDP

客户端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.ArrayList;
import java.util.List;
 
public class UDPServer {
    private static final int PORT = 9876;
    private static List<ClientInfo> clients = new ArrayList<>();
 
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(PORT);
 
            System.out.println("UDP Server is running on port " + PORT);
 
            while (true) {
                byte[] receiveData = new byte[1024];
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                socket.receive(receivePacket);
 
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Received from " + receivePacket.getAddress() + ": " + message);
 
                // Broadcast message to all clients
                broadcastMessage(message, receivePacket.getAddress(), receivePacket.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private static void broadcastMessage(String message, java.net.InetAddress address, int port) {
        for (ClientInfo client : clients) {
            try {
                DatagramSocket clientSocket = new DatagramSocket();
                byte[] sendData = message.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, client.getAddress(), client.getPort());
                clientSocket.send(sendPacket);
                clientSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    private static class ClientInfo {
        private java.net.InetAddress address;
        private int port;
 
        public ClientInfo(java.net.InetAddress address, int port) {
            this.address = address;
            this.port = port;
        }
 
        public java.net.InetAddress getAddress() {
            return address;
        }
 
        public int getPort() {
            return port;
        }
    }
}

服务端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
 
public class UDPClient {
    private static final int PORT = 9876;
 
    public static void main(String[] args) {
        try {
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter your name: ");
            String name = scanner.nextLine();
 
            DatagramSocket socket = new DatagramSocket();
            InetAddress serverAddress = InetAddress.getByName("localhost");
 
            Thread receiveThread = new Thread(() -> {
                try {
                    byte[] receiveData = new byte[1024];
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
 
                    while (true) {
                        socket.receive(receivePacket);
                        String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                        System.out.println(message);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
 
            receiveThread.start();
 
            while (true) {
                String message = scanner.nextLine();
                String formattedMessage = name + ": " + message;
                byte[] sendData = formattedMessage.getBytes();
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, PORT);
                socket.send(sendPacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

极简Excel公式拆分合并单元格并自动填充

例如这个表格&#xff1a; 我们希望拆分合并单元格&#xff0c;并填充到E列。结果如&#xff1a; 步骤 1&#xff09;在E2输入公式如下&#xff1a; LOOKUP(2,1/($B$2:B2<>""),$B$2:B2) 2&#xff09;下拉E2至E9将公式填充即可 注意&#xff1a;公式中的$…

分布式事务--初识Seata和TC部署

1.Seata介绍 Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务&#xff0c;为用户打造一站式的分布式解决方案。 官网地址&#xff1a;Seata | Seata&#xff0c;其中的文档、播客中提供了大量的使用说明…

Hudi 在 vivo 湖仓一体的落地实践

作者&#xff1a;vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下&#xff0c;vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能。主要应用在流批同源、实时链路优化及宽表拼接等业务场景。 一、Hudi 基础能力及相关概念介绍 1.1 流批同源能力 与H…

Windows系统下载安装并连接Redis

首先 我们访问地址 https://github.com/tporadowski/redis/releases 这里 我们根据自己的系统选择下载 我是 Windows msi安装包 下载下来之后 我们双击它运行 然后下一步 然后这里要同意它的条款 反正不同意不给用嘛 就这么简单 勾选之后 选择下一步 这里 我们要选一下他的安装…

Angular中使用Intersection Observer API实现无限滚动

背景&#xff1a; 实现原理为 在data下面加一个loading元素 如果此元素进入视窗 则调用api获取新的数据加到原来的数据里面&#xff0c;这时loading就会被新数据顶下去&#xff0c;如此循环。 <div id"dataContainer"></div> <div id"loadingCo…

大模型微调技巧:在 Embeeding 上加入噪音提高指令微调效果

大家好&#xff0c;在去年分享过一篇ACL2022的文章&#xff0c;通过微调前给预训练模型参数增加噪音提高预训练语言模型在下游任务的效果方法。NoisyTune方法在BERT、XLNET、RoBERTa和ELECTRA上均取得不错的效果。 那么通过加入噪音的方式&#xff0c;对现在大型语言模型是否有…

数字图像处理(实践篇)二十三 使用dlib进行人脸68关键点检测

目录 1 安装dlib 2 下载shape_predictor_68_face_landmarks.dat文件 3 涉及的函数 4 实践 使用dlib进行人脸68关键点检测实践。 1 安装dlib 使用如下命令即可安装dlib: pip install dlib

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

UE4 实用材质图形

渐变圆 光晕效果&#xff1a; 十字光晕&#xff1a;

动态通讯录(并不难都能拿下)

文章目录 &#x1f680;前言&#x1f680;通讯录实现动态通讯录的初期准备模块化框架搭建 &#x1f680;实现接口函数 &#x1f680;前言 铁子们好啊&#xff01;今天咱们来整一个有意思的玩意——通讯录&#xff0c;相信大家对通讯录并不陌生&#xff0c;那接下来就跟着阿辉把…

机械设备企业网站建设的效果如何

机械设备涵盖的类目比较广&#xff0c;其市场需求也是稳增不减&#xff0c;也因此无论大小企业都有增长的机会&#xff0c;当然这也需要靠谱的工具及正确的决策。 对机械设备企业来说&#xff0c;产品品质自然是首位&#xff0c;而向外打造品牌、扩展信息及拓客转化自然也是非…

HarmonyOS NEXT:技术革新与生态挑战的交汇点

背景 在上周&#xff08;2023年12月11日&#xff09;我有幸参加了在上海举办的华为鸿蒙生态学堂创新实训营。 参加这个活动的原因是近期关于华为的HarmonyOS NEXT不再兼容Android的消息&#xff0c;也就是说我们的Apk无法在纯血版的HarmonyOS NEXT上运行。 随后就是一些头部的…

opencv中叠加Sobel算子与Laplacian算子实现边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

windows10 php8连接sql server

一、环境安装 文章目录 一、环境安装1.安装php拓展2.在 Windows 上安装PHP驱动程序3.在 Windows 上安装ODBC驱动 二、php连接sqlserver三、注意事项数据库相关设置相关语法sqlsrv_fetch_array 的示例&#xff1a;sqlsrv_fetch 的示例&#xff1a;echo 和 print_r 的不同 所用资…

数据结构 | 查漏补缺之顺式存储和链式存储、如何评价哈希函数的好坏、链地址法、树的遍历、关键路径、完全图、连通图、迪杰斯特拉、b树

目录 顺式存储和链式存储 优缺点比较 顺序存储 ​编辑 链式存储 如何评价哈希函数的好坏 简述哈希查找中链地址法解决冲突的方法 树的遍历 关键路径 完全图 连通图 迪杰斯特拉 b树 特点&#xff1a; 插入&#xff08;索引不能大于&#xff1a;最大为 M-1 个&#…

TrustGeo代码理解(六)utils.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入常用库和模块 from __future__ import print_function from distutils.version import LooseVersion from matplotlib.scale import LogisticTransform import numpy as np import torch import warnings import t…

测序名词解释

测序深度&#xff08;Sequencing Depth&#xff09;是指&#xff1a;测序得到的碱基总量&#xff08;bp&#xff09;与基因组&#xff08;转录组或测序目标区域大小&#xff09;的比值&#xff0c;是评价测序量的指标之一。 测序深度的计算公式为&#xff1a; 测序深度 &…

Java数据结构-通过数组封装-结构分析

1、默认arrayList的数组未初始化&#xff0c;长度为0&#xff0c;容量默认是10 ArrayList<Integer> arrayList new ArrayList<>();System.out.println(ClassLayout.parseInstance(arrayList).toPrintable()); java.util.ArrayList object internals: OFF SZ …

【论文极速读】LVM,视觉大模型的GPT时刻?

【论文极速读】LVM&#xff0c;视觉大模型的GPT时刻&#xff1f; FesianXu 20231210 at Baidu Search Team 前言 这一周&#xff0c;LVM在arxiv上刚挂出不久&#xff0c;就被众多自媒体宣传为『视觉大模型的GPT时刻』&#xff0c;笔者抱着强烈的好奇心&#xff0c;在繁忙工作之…

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…