项目 多人对话

news2024/11/29 6:38:41

项目

目标

多人对话仿真平台

技术点

  • socket
  • IO
  • 异常
  • 多线程
  • 集合
  • 面向对象
  • 字符串
  • GUI(client)

项目开发方式

迭代开发-敏捷开发

建立模型

C/S 客户端/服务器模型(console)

服务器

package com.ffyc.tcp.one;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class OneServer {

    public static void main(String[] args) {

        try {
            ServerSocket server = new ServerSocket(9090);
            System.out.println("服务器启动成功....");

            while (true) {
                Socket socket = server.accept();  //阻塞式接收
                //处理--IO
                InputStreamReader in =
                        new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8);
                char[] buffer = new char[256];
                int n = in.read(buffer);
                String msg = new String(buffer);
                System.out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("服务器出现致命问题,即将...");
        }
    }
}

客户端

package com.ffyc.tcp.one;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class OneClient {

    public static void main(String[] args) {
        //ip --localhost   127.0.0.1
        try {
            Socket socket = new Socket("127.0.0.1", 9090);

            OutputStreamWriter out =
                    new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8);
            out.write("[客户端:]你吃了吗?");
            out.flush();
        } catch (IOException e) {
           e.printStackTrace();
            System.out.println("客户端连接服务器异常...");
        }

    }
}

运行

image-20241001105121605

问题

[问题] 分配缓存空间并没有占满

image-20241001105237256

image-20241001105200575

image-20241001105508882

     while (true) {
                Socket socket = server.accept();  //阻塞式接收
                //处理--IO
                InputStreamReader in =
                        new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8);
                char[] buffer = new char[256];
                int n = in.read(buffer);
                String msg = new String(buffer,0,n);
                System.out.println(msg);
            }

image-20241001105647821

客户端图形化

目标

改造客户端 GUI

UI

image-20241001111155436

image-20241001111506717

image-20241001111828507

移植客户端代码

image-20241001114406383

image-20241001135808346

问题处理

多客户端发送数据

image-20241001140300984

idea并行开启多客户端

image-20241001140415936

image-20241001140511708

image-20241001140619328

image-20241001140707225

image-20241001140759508

GUI关闭问题

image-20241001140857853

image-20241001140919558

image-20241001141357916

socket创建问题

点击就创建socket对象

image-20241001141659242

image-20241001142207218

服务器效率

服务器问题产生

使用多线程完成和多个客户端交互。

image-20241001143243715

创建线程

image-20241001143645803

new Thread(() -> {
    try {
        InputStreamReader in =
                new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8);
        char[] buffer = new char[256];
        int n = in.read(buffer);
        String msg = new String(buffer,0,n);
        System.out.println(msg);
    } catch (IOException e) {
       e.printStackTrace();
        System.out.println("与客户端连接异常...");
    }
}).start();

请求-响应

image-20241001151423760

服务器响应问题

image-20241001151725099

客户端

接收服务端数据

 //接收服务器的响应
        new Thread(() -> {
            while (true) {
                try {
                    InputStreamReader in = new InputStreamReader(
                            socket.getInputStream(), StandardCharsets.UTF_8
                    );
                    char[] buffer = new char[256];
                    int n = in.read(buffer);
                    String msg = new String(buffer, 0, n);
                    respTextArea.setText(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("接收服务器响应异常....");
                }
            }
        }).start();

image-20241001152919926

服务器转发

服务器注册客户端

image-20241001164129885

image-20241001164157260

image-20241001171045470

向其它客户端转发

     while (true) {
                Socket socket = server.accept();  //阻塞式接收
                list.add(socket);
                //创建线程
                new Thread(() -> {
                    while (true) {
                        try {
                            //读取客户端请求
                            InputStreamReader in =
                                    new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8);
                            char[] buffer = new char[256];
                            int n = in.read(buffer);
                            String msg = new String(buffer, 0, n);
                            System.out.println(msg);
                            //响应客户端请求
                            for (Socket ss : list) {
                                    OutputStreamWriter out
                                            = new OutputStreamWriter(ss.getOutputStream(), StandardCharsets.UTF_8);
                                    Date date = new Date();
                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                                    out.write("[服务器" + sdf.format(date) + "]200:" + msg);
                                    out.flush();
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                            System.out.println("与客户端连接异常...");
                        }
                    }
                }).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("服务器出现致命问题,即将...");
        }
    }
                System.out.println("与客户端连接异常...");
                    }
                }
            }).start();
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("服务器出现致命问题,即将...");
    }
}

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

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

相关文章

【大模型】RMS Normalization原理及实现

1.RMS Normalization的原理 说RMS Normalization之前,先讲Layer Normalization 和 Batch Normalization。 BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化,即对同一batch中每个特征维度的值进行…

操作系统的了解及安装

一、linux系统认识 linux是指操作系统的内核,ubuntu是指基于这种内核的操作系统,Ubuntu属于Linux的一个发行版本,有简易的用户界面,完善的包管理系统,Ubuntu还对大多数硬件有着良好的兼容性,包含最新的图形…

一文区分SSTI 和 CSTI

前言 有时,SSTI(服务器端模板注入)和 CSTI(客户端模板注入)可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell,即使payload仅限于客户端。 定义 &#x1d…

10.11 QT数据库实现学生信息的增、删、改、查

.pro文件 QT core gui sql .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //数据库查寻类 #include <QSqlRecord> //记录类 #include <QMessage…

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读&#xff1a;通过ChatGPT与Python的结合&#xff0c;数据分析流程得到了极大的优化和提升&#xff0c;从数据获取、清洗、代码生成到智能分析和可视化展示&#xff0c;每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率&#xff0c;还降低了技术门槛&#xff…

网络编程(18)——使用asio协程实现并发服务器

十八、day18 到目前为止&#xff0c;我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型&#xff0c;今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处&#xff1a; 协程比线程更轻量&#xff0c;创建和销毁协程的开销较…

【python】之socket编程(附带无偿源码)

本章内容 1、socket 2、IO多路复用 3、socketserver Socket socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现&#xff0c;socket即是一种特殊的文件&…

【路径规划】自主机器人的路径规划和导航

摘要 本文讨论了如何利用路径规划算法对自主机器人进行路径规划和导航。自主机器人在环境中的路径规划是通过参考路径与机器人的当前位置进行比对&#xff0c;采用纯追踪算法&#xff08;Pure Pursuit&#xff09;进行路径跟踪&#xff0c;以确保机器人沿预定路线行驶。本文通…

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

双十一适合买什么?2024双十一值得入手好物推荐

即将来临的2024年双十一&#xff0c;有哪些超值宝贝会令人忍不住疯狂下单呢&#xff1f;双十一购物狂欢节&#xff0c;这个一年一度的盛大庆典&#xff0c;向来使我们这些热衷于购物的消费者们激动万分。那么&#xff0c;在今年的双十一&#xff0c;究竟有哪些商品能够成功吸引…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…

Docker安装Minio+SpringBoot上传下载文件

Docker 安装Minio docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外挂磁盘存储使用 mkdir -p…

高清实拍类型视频素材网站推荐

大家好&#xff0c;我是一名新媒体创作者&#xff0c;今天想和大家分享一些平时常用的高清实拍类型视频素材资源。作为新媒体人&#xff0c;视频素材的质量直接影响作品的受欢迎程度&#xff0c;因此找到优质的视频素材库非常重要。接下来&#xff0c;我将为大家推荐一些非常优…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12 1. Autoregressive Large Language Models are Computationally Universal D Schuurmans, H Dai, F Zanini - arXiv preprint arXiv:2410.03170, 2024 https://arxiv.org/pdf/2410.03170 自回归大型语言模型…

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

UE5安卓,多指点击时会调出控制台

参考文章&#xff1a; How to turn off "console window" on swipe (my Lemurs keep opening it!) - Platform & Builds / Mobile - Epic Developer Community Forums (unrealengine.com) 准确来说是4只手指同时在屏幕中按下。这个控制台能像编辑器那样&#xf…

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

小米员工薪资一览表

小米 之前我们写了 京东 和 华为OD&#xff0c;不少同学在后台点名要看小米的职级和薪资。 没问题&#xff0c;在了解小米的薪资分布前&#xff0c;我们要先对小米职级有个初步概念。 小米职级从 13 到 22&#xff0c;共 10 级。 title 大致分为 专员&#xff08;13~15级&#…

go语言中的template使用

在 Go 语言中&#xff0c;你可以使用 text/template 或 html/template 包来创建和执行模板。以下是一个基本示例&#xff0c;展示如何使用 Go 的模板语法&#xff1a; 1. 导入包 import ("os""text/template" )2. 创建数据结构 定义一个数据结构&#x…