Java程序设计:Java 网络聊天室服务器端

news2024/11/16 12:08:16

 网络编程相关内容见上一篇:Java程序设计:Java网络编程实验

目录

1 实验名称

2 实验目的

3 实验源代码

4 实验运行结果图

5 总结


1 实验名称

      Java 网络聊天室服务器端

2 实验目的

       继续熟练掌握在eclipse中调试代码

       掌握Java面向对象思想掌握多线程在该项目中的使用

       掌握GUI编程在该项目中的使用

       掌握IO在该项目中的使用

       掌握多线程在该项目中的使用

       掌握Java 网络编程在该项目中的使用

       掌握TCP协议和Socket套接字编程在该项目中的使用

3 实验源代码

package Text01.NetworkProgrammingText;

import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
    private List<ClientThread> clients; // 客户端列表
    private int port; // 监听端口
    private boolean running; // 服务器运行状态标记

    public Server(int port) {
        this.port = port;
        clients = new ArrayList<ClientThread>();
    }

    public void start() {
        running = true;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("服务器启动,等待客户端连接...");

            while (running) {
                Socket client = serverSocket.accept(); // 监听客户端连接请求
                System.out.println("客户端 " + client.getInetAddress().getHostAddress() + " 连接成功");

                ClientThread clientThread = new ClientThread(client, this); // 创建客户端线程
                clients.add(clientThread); // 将客户端线程加入列表
                clientThread.start(); // 启动客户端线程
            }
        } catch (IOException e) {
            System.out.println("服务器启动失败: " + e.getMessage());
        } finally {
            stop(); // 关闭服务器
        }
    }

    public synchronized void stop() {
        running = false; // 设置服务器运行状态为false
        for (ClientThread client : clients) {
            try {
                client.close(); // 关闭客户端线程
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        clients.clear(); // 清空客户端列表
        System.out.println("服务器已停止");
    }

    public synchronized void broadcastMessage(String message, ClientThread sender) {
        for (ClientThread client : clients) { // 遍历客户端列表
            if (client != sender) { // 发送消息给除自己外的其他客户端
                client.sendMessage(sender.getClientName() + ": " + message);
            }
        }
    }

    public synchronized void removeClient(ClientThread client) { // 从客户端列表中移除指定的客户端
        clients.remove(client);
        System.out.println(client.getClientName() + " 已离开聊天室");
    }

    public static void main(String[] args) {
        int port = Integer.parseInt("8080"); // 设置端口号参数
        Server server = new Server(port); // 创建服务器对象
        server.start(); // 启动服务器
    }
}

class ClientThread extends Thread {
    private Socket socket;
    private Server server;
    private BufferedReader input; // 输入流,用于读取客户端发送的消息
    private BufferedWriter output; // 输出流,用于向客户端发送消息
    private String clientName; // 客户端名称

    public ClientThread(Socket socket, Server server) {
        this.socket = socket;
        this.server = server;
    }

    public void run() {
        try {
            openStreams(); // 打开输入流和输出流
            clientName = input.readLine(); // 读取并保存客户端名称
            output.write("欢迎加入聊天室, " + clientName + "! \n");
            output.flush();

            String message = "";
            while (!message.equals("bye")) { // 循环读取客户端发送的消息并广播出去
                message = input.readLine();
                if (!message.equals("bye")) {
                    server.broadcastMessage(message, this);
                }
            }

            server.removeClient(this); // 客户端离开聊天室
            close();
        } catch (IOException e) {
            System.out.println("客户端读写异常: " + e.getMessage());
            server.removeClient(this); // 关闭客户端线程
        }
    }

    public String getClientName() { // 获取客户端名称
        return clientName;
    }

    public void sendMessage(String message) { // 向客户端发送消息
        try {
            output.write(message + "\n");
            output.flush();
        } catch (IOException e) {
            System.out.println("消息发送失败: " + e.getMessage());
        }
    }

    public void close() throws IOException { // 关闭输入流、输出流和socket连接
        input.close();
        output.close();
        socket.close();
    }

    public void openStreams() throws IOException { // 打开输入流和输出流
        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    }
}

4 实验运行结果图

5 总结

       此次实验通过创建服务器、处理客户端请求、多线程服务器、客户端编程等一系列步骤完成了这次任务。此次实验中,使用ServerSocket类创建了一个简单的服务器,并处理了客户端连接请求;接着使用Socket类处理了客户端发送的消息,并向客户端返回相应消息;然后使用多线程服务器来处理多个客户端的连接请求,实现了并发处理功能;最终也实现了一个简单的客户端程序,并与服务器进行通信。

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

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

相关文章

数据加密-AES数据加密及C#实现

引言 AES&#xff08;Advanced Encryption Standard&#xff09;是一种广泛使用的对称密钥加密算法&#xff0c;由美国国家标准与技术研究院&#xff08;NIST&#xff09;于2001年发布。AES以其高效、安全的特点&#xff0c;在数据加密领域占据了重要地位。 using System; us…

XGP怎么免费玩暗黑4 暗黑4XGP免费白嫖教程

暗黑四新赛季已经开启了&#xff0c;全新赛季一定能给你带来完全不一样的感受&#xff0c;在新赛季中&#xff0c;恶魔入侵&#xff0c;炼狱大军来袭&#xff0c;玩家在完成世界阶级三任务线之后&#xff0c;就可以参与炼狱大军的战斗&#xff0c;怪物会一波一波的形式攻击&…

html+css+js网页制作 船票网1个订单页面带js 有增加和删除功能

htmlcssjs网页制作 船票网1个订单页面带js 有增加和删除功能 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。…

一个在国内好用且免费的AI网站,可以让自己的学习或者工作方面,事半功倍!它就是codemoss_能用AI

一、开头放重点 &#x1f525;世界主流大模型集聚地 免魔法 白玩GPT4 AI智能工作流 Codemoss_能用AI 传送门&#xff1a;https://www.nyai.chat/chat?invitenyai_1141439 还是那句话&#xff0c;一个好用的AI工具&#xff0c;可以在学习或者工作上&#xff0c;事半功倍。…

如何建立强大的谷歌外链网络?

​要建立一个强大的谷歌外链网络&#xff0c;要理清楚一个观念&#xff0c;质量和数量同等重要&#xff0c;没有垃圾的&#xff0c;质量低下的外链&#xff0c;只有有效跟无效的外链&#xff0c;在弄清楚这一点的前提下&#xff0c;你要知道&#xff0c;一个网站&#xff0c;尤…

在Fiddler中的Composer使用post方法发送非法数据

1、如图所示&#xff0c;先通过fiddler抓取接口 2、抓取接口后复制url 3、在fillder中切换到Composer界面&#xff0c;复制的url粘贴到接口输入框中&#xff0c;并将请求类型改为POST. 4、点击该接口&#xff0c;切换到Inspectors-Raw下 复制请求头以及请求参数 5、将请求头复制…

windows端口转发

使用场景 前提条件&#xff1a; 双网段网络环境&#xff08;A网段、B网段&#xff09;跳板机一台&#xff0c;或者称为目标服务器一台。 目标&#xff1a; &#xff08;在A网段&#xff09;访问这台服务器的IP端口(例如10.143.21.62:10000)&#xff0c;提供服务的是B网段的服务…

【HarmonyOS NEXT星河版开发学习】界面开发实战b-支付宝界面

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 难度系数&#xff1a; 目录 前言 知识点概述 Scroll组件 基本用法 注意事项 层叠布局 层叠布局的特性 层叠布局的应用场景 Stack组…

windows10搭建maxkb开发环境(劝退指南)

windows搭建maxkb开发环境踩坑记录&#xff0c;先说结论吧&#xff0c;windows上面搞不下去了&#xff0c;直接在ubuntu等linux环境搭建吧&#xff0c;别浪费时间了。 1.maxKB开发环境搭建 官方文档&#xff1a;https://maxkb.cn/docs/dev_manual/dev_environment/ 2.各种坑 …

C++知识点总结:5.多态和虚函数(自用)

多态和虚函数 1. 多态和虚函数2. 引用形式的多态3. 虚函数注意事项4. 构成多态的条件5. 为什么构造函数不能是虚函数6. 虚析构函数的必要性7. 纯虚函数8. 抽象类9. 虚函数表10. typeid运算符&#xff1a;获取类型信息11. RTTI机制&#xff08;C运行时类型识别机制&#xff09;1…

加速开发利器:代码生成器如何快速生成后端接口?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 在现代软件开发中&#xff0c;重复性的增删改查逻辑代码的编写往往非常耗时且容易出错。为了提高开发效率&#xff0c;减少手动维护的成本&#xff0c;代码生成器就成为了一个非常…

MySQL常用的日期和时间函数

文章目录 概述日期和时间函数 概述 在 MySQL 中&#xff0c;有许多常用的日期和时间函数&#xff0c;可以帮助你处理和操作日期和时间字段。 日期和时间函数 获取当前日期和时间 NOW(): 返回当前的日期和时间。CURRENT_DATE() 或 CURDATE(): 返回当前的日期&#xff08;不包括…

3C产品手册制作7步骤:让消费者快速了解产品

引言 在这个信息爆炸的时代&#xff0c;如何让消费者在众多3C产品&#xff08;计算机、通讯、消费电子&#xff09;中快速了解并选择您的产品&#xff1f;一份精心制作的产品手册无疑是关键。它不仅是产品的“名片”&#xff0c;更是连接品牌与消费者的桥梁。接下来&#xff0…

2024年湖北省建筑施工特种作业人员证书延期申请/年审

2024年湖北省建筑施工特种作业人员证书延期申请/年审 建筑电工、建筑架子工、建筑起重机械司机、信号工、施工升降机等延期&#xff0c;要注意提前3个月内进行延期&#xff0c;2年1延期。 湖北特种作业考核管理系统跳转至延期申请申报页面&#xff0c;再点击“新增”按钮&…

Games101--shading 3

1.重心坐标 为什么要进行插值&#xff1f;&#xff08;因为有很多的计算实在三角形内部进行的&#xff0c;而我们需要形成一个平滑的过渡&#xff09; 插值需要插值什么内容&#xff1f;&#xff08;颜色&#xff0c;纹理映射&#xff0c;法线插值&#xff0c;可以对三角形的…

计算机毕业设计选题推荐-C语言学习辅导网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

springboot工程,无法访问index.html主页

1、问题概述&#xff1f; 我们使用springboot开发了工程后&#xff0c;会将项目打包成jar包或者war包放到服务器端进行发布&#xff0c;但是在打包后&#xff0c;时长会出现index.html主页无法访问的情况。 先分析几种常见的主页无法访问的解决方案&#xff0c;助你解决问题&…

【wiki知识库】08.添加用户登录功能--后端SpringBoot部分

目录 一、今日目标 二、SpringBoot后端实现 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代码 2.4 创建用户上下文工具类 2.5 通过token校验用户&#xff08;重要&#xff09; 2.6 创建WebMvcConfig 2.7 用户权限校验拦截器 一、今日目标 上篇…

职业本科大数据实训室

一、职业本科大数据实训室建设背景 在数字化浪潮汹涌澎湃的今天&#xff0c;大数据已跃升为引领社会进步和经济发展的新引擎。随着《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的深入实施&#xff0c;数字化转型作为国家战略的重要组成部分&…

微信小程序登录获取 session_key 和 openid

一、申请测试小程序&#xff0c;只要微信扫码授权就可以申请了。 二、调用接口获取登录凭证&#xff08;code&#xff09;。通过凭证进而换取用户登录态信息&#xff0c;包括用户在当前小程序的唯一标识&#xff08;openid&#xff09;、微信开放平台账号下的唯一标识&#xf…