J031_使用TCP协议支持与多个客户端同时通信

news2024/9/24 3:26:16

一、需求文档

使用TCP协议支持与多个客户端同时通信。

1.1 Client

package com.itheima.tcp2;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1、创建socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1",8888);

        //2、从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3、把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            //退出
            if ("exit".equals(msg)) {
                System.out.println("欢迎下次光临!退出成功");
                dos.close();
                socket.close();
                break;
            }

            //4、开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

1.2 Server

package com.itheima.tcp2;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        //启动服务端
        System.out.println("-----服务端启动成功------");

        //1、创建serversocket对象,同时为服务端程序注册端口
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            //2、使用serverSocket对象,调用accept方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();

            System.out.println("有人上线了" + socket.getRemoteSocketAddress());

            //3、把这个客户端对于的socket通信管道,交给一个独立的线程负责处理
            new ServerReaderThread(socket).start();
        }
    }
}

1.3 ServerReaderThread

package com.itheima.tcp2;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ServerReaderThread extends Thread{
    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                } catch (Exception e) {
                    System.out.println("有人下线了!" + socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}

二、运行结果

客户端1

客户端2

客户端3

服务端

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

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

相关文章

软件设计之Java入门视频(22)

软件设计之Java入门视频(22) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

Flask 介绍

Flask 介绍 为什么要学 Flask框架对比设计哲学功能特点适用场景学习曲线总结 Flask 的特点Flask 常用扩展包Flask 的基本组件Flask 的应用场景官方文档官方文档链接文档内容概述学习建议 Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它旨在让 Web 开发变得快速、简单且…

ACl访问控制实验

要求:PC1可以telnet登录r1,不能ping通r1,pc1可以ping通r2,但不能telnet登录r2,pc2的所有限制与pc1相反 实验思路:因为华为的ensp默认允许所有,所以只写拒绝规则就行 rule 5 deny icmp source 19…

只需0.5秒 Stability AI新模型超快生成3D图像

生成式人工智能(AI)明星初创公司Stability AI 8月发布最新突破性3D模型Stable Fast 3D,将单张图片生成3D图像的速度大幅提升。Stability AI今年3月发布的3D模型SV3D需要多达10分钟生成3D资产,基于TripoSR的新模型Stable Fast 3D完…

【面试官:我看你SQL语句掌握的怎么样?面试SQL语句专题3】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【教程】Python语言的地球科学常见数据—— IMS积雪覆盖数据的处理

将ASCII数据转化为netCDF数据、分析新疆北疆、青藏高原和东北地区气候态积雪分布、分析新疆北疆、青藏高原和东北地区积雪面积变化规律。 美国国家冰雪中心(NSIDC)从 1997 年 2 月至今的北半球雪盖和海冰的地图。这些数据以 ASCII 文本和 GeoTIFF 格式提…

AIWEB1综合靶场通关教程,从外网打到内网【附靶场环境】

前言 靶场获取后台回【aiweb1】 下载之后设置为nat模式 启动即可,不需要登录 靶机复现 主机发现 访问即可 信息收集robots.txt文件 访问尝试,原来是什么也没有的,404 我们去访问这个上级目录,发现有一个id 注入测试 语法错误&am…

基于Protobuf的RPC

先上UserServer提供服务的函数要求proto文件内容: syntax"proto3"; package fixbug; option cc_generic_servicestrue; message LoginRequest {bytes name1;bytes pwd2; } message LoginResponse {ResultCode result1;bool sucess2; } #调用远程服务的入…

JAVA游戏源码:跑酷|大学生练手项目

学习java朋友们,福利来了,今天小编给大家带来了一款跑酷源码。注意:此源码仅供学习使用!! 源码搭建和讲解 启动main入口: //************************************************************************ // ************完整源码…

AcWing食物链

Q1:怎么判断X和Y是不是同类? A:判断这俩是不是在一个集合中,如果在同一个集合中,那么判断X到祖先节点的距离D[X]和D[Y]到祖先节点的距离是否有D[X]%3D[Y]%3,也就是3同余 若果是,那么是同类。如果X和Y不在一个集合里面,那么把X和Y…

护网总结汇报PPT一键生成,还要啥售前工程师

【文末送:技战法】 干技术的,特别是干安服的,你让我日个站觉得没问题,你让我写个文档我挠挠头,抓抓背也能凑一篇,但是你要让我写个ppt,那我觉得你在为难我。 报告我都写好了,为啥还…

Eclipse Debug 配置

创建和使用 Debug 配置 Eclipse Debug 配置类似于运行配置但它是用于在调试模式下开启应用。 打开 Debug 配置对话框步骤为:Run > Debug Configurations 。 从左侧列表中选择 "Java Application" 选项来选择要调试的 Java 代码。 对话框中的描述信息…

24年电赛——自动行驶小车(H题)MSPM0G3507-编码电机驱动与通用PID

一、编码电机驱动 编码电机的详情可以查看此篇文章: stm32平衡小车--(1)JGB-520减速电机tb6612(附测试代码)_jgb520-CSDN博客 简单来说,编码电机的驱动主要是给一个 PWM 和一个正负级就能驱动。PWM 的大小…

AI PC处理器架-低功耗、NPU算力、大模型

AI PC处理器架构变化:ARM低功耗、引入NPU算力、大模型落地端侧 ARM架构以简洁的指令集设计,快速执行每条命令,实现低功耗下的高效性能。其核心理念是节能和效率,为电池驱动设备提供了理想选择。相较之下,x86架构虽指令…

Linux--shell脚本语言—/—<1>

一、shell简介 Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构&am…

【practise】大数相加、大数相乘

通常,我们的int、long long类型都有最大的数字上限,也就是说再大了会有溢出问题,那么很大的数字是怎么进行运算的呢? 其中一种方法是把很大的数字转变成字符串存放到string中,然后用代码对字符串进行处理,…

PHP最新可用获取QQ昵称API接口源码_非第三方

PHP最新可用获取QQ昵称API接口源码,运行环境为php7-8都可以,内容为直接调用QQ空间接口 在需要展示QQ昵称处,直接调用以下函数就可以。 例如:get_qq_nick(123456)就会直接输出123456的qq号昵称。 API源码下载:QQ昵称AP…

【C语言】字符函数和字符串函数详解

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 内容一览 一、strlen …

一拖三无线充底座-带给你极致的便利生活

随着科技的不断进步,无线充电技术已经逐渐渗透到我们日常生活的方方面面,一拖三无线充底座作为其中的佼佼者,以其高效、便捷的特点受到广大用户的青睐。本文将从电磁感应原理、多线圈设计、频率匹配、电能传输、功率分配以及充电管理六个方面…

【Rust日报】终端表格查看工具

[new ver] Tabiew v0.6.1 Tabiew 是一个轻量级的、基于终端的应用程序,用于查看和查询分隔符分隔值格式的文档,例如 CSV 或 TSV 文件。 功能如下: 📊 表格视图: 通过易于导航的表格视图来探索数据。🔍 工作表视图: 深入…