chat2-Client发送数据给Server

本文档描述了Client发送消息给Server, Server端打印接收的消息

一、Client

1.1.客户端的类Client.java中添加如下的start()方法 (表示启动客户端功能的方法),并调用

/**start方法,作为客户端开始工作的方法*/
    public void start(){
        try {
            //Socket提供的方法: OutputStream getOutputStream(),通过该Socket获取
            //一个字节输出流,使用这个流写出的所有字节都会陆续发送给服务端对应的Socket
            OutputStream out = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw);
            PrintWriter pw = new PrintWriter(bw,true);
            Scanner scanner = new Scanner(System.in);
            String nickname;
            while(true){
                System.out.println("请输入昵称:");
                nickname = scanner.nextLine();
                if(nickname.trim().length()>0){
                    pw.println(nickname);
                    break;
                }
                System.out.println("昵称不能为空");
            }
            //启动读取服务端发送过来消息的线程
//            ServerHandler handler = new ServerHandler();
//            Thread t = new Thread(handler);
//            t.setDaemon(true);
//            t.start();

            while(true) {
                String line = scanner.nextLine();
                if("exit".equalsIgnoreCase(line)){
                    break;
                }
                pw.println(line);
            }
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //调用socket的close方法时可以和对方发起四次挥手断开连接
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

1.2.main方法中调用此方法:

在main方法中添加client.start();

二、Server端:

A.服务端用 ServerSocket 对象开启一个端口。并在 while 循环中调用 ServerSocket 对象的 accept()方法等待客户端连接.

B.如果有客户端连接成功accept()方法会得到一个socket对象。

注: socket对象和服务端对应,里边包含此客户端和服务端对应的输入流和输出流可以用来读服务端发送的数据并给服务端返回数据。

C.将socket对象封装到一个线程中,并用线程池运行此线程中的任务。

2.1.线程池的类

创建线程池的核心类对象:

2.2.编写线程类:

/**该线程任务是负责与指定的客户端进行交互*/
    private class ClientHandler implements Runnable{
        private Socket socket;//服务端的socket包含输出流和输入流用于接收客户端数据并返回输出给客户端
        private String host;//对应客户端的IP地址
        private String nickName;//客户端的昵称
        public ClientHandler(Socket socket){
            this.socket = socket;
            //通过socket获取客户端的ip地址信息
            host = socket.getInetAddress().getHostAddress();
        }
        public void run(){
            try {
                //Socket类中的方法: InputStream getInputStream()
                //通过该Socket对象获取的输入流(可以读取对应客户端发送过来的字节数据)
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr);//字节输入流封装为缓冲字符输入流
                //读取一行字符串(是对应客户端发送过来的昵称)
                nickName = br.readLine();
                String message;
                //服务端调用br.readLine()读取客户端发送过来的一行字符串
                //  读取时如果客户端异常断开连接了,则可能出现异常:

//java.net.SocketException: Connection reset
                //  (原因:没有进行四次挥手)
                while ((message = br.readLine()) != null) {
                    System.out.println(nickName + "[" + host + "]说:" + message);
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println(e.getMessage());
            } finally {
                //处理客户端断开连接后的操作
                System.out.println(nickName+"下线了");
                try {
                    //3.将socket关闭,释放资源
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

2.3.启动线程:

用线程池运行此线程中的任务:

运行效果:


                                                                                                   By   zhaoyq   2024-05-31

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

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

相关文章

【SpringMVC】_SpringMVC实现用户登录

目录 1、需求分析 2、接口定义 2.1 校验接口 请求参数 响应数据 2.2 查询登录用户接口 请求参数 响应数据 4、服务器代码 5、前端代码 5.1 登录页面login.html 5.2 首页页面index.html 6、运行测试 1、需求分析 用户输入账号与密码,后端校验密码是否正确&a…

Python-3.12.0文档解读-内置函数sum()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 sum(iterable, /, start0) 参数: 返回值: 注意事…

【风力发电】山顶的白色“大风车”你了解吗?

文章目录 术语定义 基本要求 外部条件 电气系统 控制系统 参考资料 术语定义 风力发电机组wind turbine generator system;WTGS,将风的动能转换为电能的系统。示例如下: 支撑结构support structure,风力发电机组的塔架和基础部分。 机舱…

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自:使用 NVIDIA NeMo 训练本地化多语种 LLM (2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

优盘打不开的困境与解决之道

在日常的工作和生活中,优盘作为一种便携式存储设备,因其小巧、轻便和容量大等特点而备受青睐。然而,当优盘突然无法打开时,我们往往会陷入一片混乱之中,担心存储在其中的重要数据会因此丢失。本文将详细解析优盘打不开…

服务器进不去conda环境问题

source ~/.bashrc 立即重新加载和应用 .bashrc 配置文件中的设置。当你对 .bashrc 文件进行了修改,比如添加或修改了环境变量、别名(alias)、函数等功能后,通常需要执行这个命令来让这些更改在当前终端会话中生效,而无需关闭并重新打开终端。…

牛客网刷题 | BC111 空心正方形图案

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

解决mysql5.7版本中,子查询order by后,对子查询进行group by分组获取最新记录无效的问题

目录 场景简介原因示例mysql5.7之前的版本mysql5.7之后的版本解决1、使用having2、使用limit3、使用子查询获取目标数据ID 场景简介 子查询order by后,对子查询进行group by分组获取最新记录失败 应用场景:一对多的关系,通常需要取最新、最…

牛客网刷题 | BC107 箭形图案

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

IO流(2)

缓冲流 字节缓冲流 利用字节缓冲区拷贝文件,一次读取一个字节: public class test {public static void main(String [] args) throws IOException {//利用字节缓冲区来拷贝文件BufferedInputStream bisnew BufferedInputStream(new FileInputStream(&…

【CTF MISC】XCTF GFSJ0008 low Writeup(LSB隐写+QR Code识别)

low 暂无 解法 用 StegSolve 打开,Green plane 1 中疑似隐藏有二维码。 使用大佬写的代码: from PIL import Imageimg Image.open("./low.bmp") img_tmp img.copy() pix img_tmp.load() width, height img_tmp.size for w in range(wid…

[论文精读]Supervised Community Detection with Line Graph Neural Networks

论文网址:[1705.08415] Supervised Community Detection with Line Graph Neural Networks (arxiv.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 ⭐内涵大量可视…

基于Springboot开发的外卖餐购项目(后台管理+消费者端)

免费获取方式↓↓↓ 项目介绍039: 系统运行 后端登录页: http://localhost:8081/backend/page/login/login.html 消费端请求:消费端主页: http://localhost:8081/front/index.html 管理员账号 admin 123456 消费者不需要登录 采用技术栈 前端:Eleme…

嵌入式期末复习

一、选择题(20) 二、判断题(10) 三、填空题(10) 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…

设计模式(八)结构型模式---装饰者模式

文章目录 装饰者模式简介结构UML图具体实现UML图代码实现 装饰者模式简介 装饰者模式(Decorator Pattern)是动态的将新对象依附到对象上。相当于对象可以包裹对象本身,然后可以根据递归方式获取想要的信息。实际使用: JDK中的IO流…

python根据版本下载外部库的.whl文件、python下载离线whl文件、python查找whl历史版本

文章目录 一、python下载外部库的.whl文件 当遇到pip源中没有对应的包,或者网络波动时,可能出现需要离线安装的方法。这里记录一下下载安装whl文件的操作。 一、python下载外部库的.whl文件 1、在浏览器输入https://pypi.org/进入PYPI官网 2、在弹出的…

LitCTF 2024(公开赛道)——WP

目录 Misc 涐贪恋和伱、甾―⑺d毎兮毎秒 你说得对,但__ 盯帧珍珠 Everywhere We Go 关键,太关键了! 女装照流量 原铁,启动! 舔到最后应有尽有 The love Web exx 一个....池子? SAS - Serializing Authent…

WSL2-Ubuntu22.04-配置

WSL2-Ubuntu22.04-配置 准备1. WSL相关命令[^1]2. WSL2-Ubuntu22.04可视化3. WSL2 设置 CUDA4. 设置OpenGL 本文介绍了WSL2的基本使用方法及可视化,着重介绍了GPU和OpenGL的设置。 准备 名称版本windows11wsl2CUDA12.5 1. WSL相关命令1 查看已安装的wsl distribut…

大话C语言:第21篇 数组

1 数组概述 数组是若干个相同类型的变量在内存中有序存储的集合。 数组是 C 语言中的一种数据结构,用于存储一组具有相同数据类型的数据。 数组在内存中会开辟一块连续的空间 数组中的每个元素可以通过一个索引(下标)来访问,索…