[Java][网络编程]服务端向客户端发送信息

/*
    前置知识(服务端)
    1.首先要常见一个ServerSocket对象 服务端套接字,并且在服务端套接字里面确定需要使用的端口
    2.然后要创建一个Socket对象来接收ServerSocket的返回值。通常一个Socket对象对应一个客户端/涉及到多个客户端需要通过线程来解决
    3.现在客户端和服务端已经通过socket链接了,然后就需要创建一个InputStream的输入流来获取socket所对应客户端的流入内容
    4.然后很关键的一点:需要创建一个ByteArrayOutPutStream这样的 字符数组的输出流来在控制台输出内容
    5.创建一个缓冲的字节数组Byte[] 然后给定它的大小 比如1024
    6.现在我们进入循环读取客户端传进流的信息的时候了,因此需要调用接收传入流的ips中的read方法
    7.然后将读取到的内容放入到Byte[]数组中,然后通过ByteArrayOutputStream的write方法将Byte[]数组输出在控制台
    8.因为客户端输入的信息一般都是字符串 因此我们需要把baos这个ByteArrayOutputStream转换成String
    9.我们得把创建对象 和把对对象赋值的部分都留在try-with-resources结构里面 这样可以避免手动关闭对象对资源的占用
     */
/*
前置知识(客户端):
1.还是先把try-with-resources结构摆出来
2.因为我们是客户端,希望输出内容,我们就得先和服务端链接
3.我们创建一个Socket套接字,先给本地安排一个地址,然后端口得和服务端对上
比如我们是服务端ip为127.0.0.1 端口为8090 我们就得把这个套接字对准8090和127.0.0.1
4.接下来我们依然是要和服务端一样依托io流来完成信息的传递
比如我们依然需要创建一个OutputStream对象,然后让这个对象和Socket发生关联 比如getOutputStream这个方法
5.我们在OutputStream这个对象和Socket产生关联之后 就可以调用OutputStream来调用write方法来输出文字了
6.我们要切记:我们只能在此输入字节类型的文件 因此需要调用getByte().
 */


    /*
    前置知识(客户端):
    1.还是先把try-with-resources结构摆出来
    2.因为我们是客户端,希望输出内容,我们就得先和服务端链接
    3.我们创建一个Socket套接字,先给本地安排一个地址,然后端口得和服务端对上
    比如我们是服务端ip为127.0.0.1 端口为8090 我们就得把这个套接字对准8090和127.0.0.1
    4.接下来我们依然是要和服务端一样依托io流来完成信息的传递
    比如我们依然需要创建一个OutputStream对象,然后让这个对象和Socket发生关联 比如getOutputStream这个方法
    5.我们在OutputStream这个对象和Socket产生关联之后 就可以调用OutputStream来调用write方法来输出文字了
    6.我们要切记:我们只能在此输入字节类型的文件 因此需要调用getByte().
     */
    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) {
            String serverHost = "127.0.0.1";
            int serverPort = 8888;

            try {
                // 创建socket连接服务器
                Socket socket = new Socket(serverHost, serverPort);

                // 获取输入输出流
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);

                while (true) {
                    // 从控制台读取用户输入的消息
                    System.out.print("请输入要发送的消息:");
                    String message = reader.readLine();

                    // 发送消息到服务器
                    writer.println(message);

                    // 如果输入的消息为"bye",则退出循环
                    if (message.equals("bye")) {
                        break;
                    }

                    // 从服务器接收消息
                    BufferedReader serverReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String serverMessage = serverReader.readLine();
                    System.out.println("服务器返回的消息: " + serverMessage);
                }

                // 关闭连接
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /*
        前置知识(服务端)
        1.首先要常见一个ServerSocket对象 服务端套接字,并且在服务端套接字里面确定需要使用的端口
        2.然后要创建一个Socket对象来接收ServerSocket的返回值。通常一个Socket对象对应一个客户端/涉及到多个客户端需要通过线程来解决
        3.现在客户端和服务端已经通过socket链接了,然后就需要创建一个InputStream的输入流来获取socket所对应客户端的流入内容
        4.然后很关键的一点:需要创建一个ByteArrayOutPutStream这样的 字符数组的输出流来在控制台输出内容
        5.创建一个缓冲的字节数组Byte[] 然后给定它的大小 比如1024
        6.现在我们进入循环读取客户端传进流的信息的时候了,因此需要调用接收传入流的ips中的read方法
        7.然后将读取到的内容放入到Byte[]数组中,然后通过ByteArrayOutputStream的write方法将Byte[]数组输出在控制台
        8.因为客户端输入的信息一般都是字符串 因此我们需要把baos这个ByteArrayOutputStream转换成String
        9.我们得把创建对象 和把对对象赋值的部分都留在try-with-resources结构里面 这样可以避免手动关闭对象对资源的占用
         */
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class TCPServer {
        public static void main(String[] args) {
            int serverPort = 8888;

            try {
                // 创建ServerSocket监听指定端口
                ServerSocket serverSocket = new ServerSocket(serverPort);

                System.out.println("等待客户端连接...");

                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("客户端连接成功!");

                // 获取输入输出流
                BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);

                while (true) {
                    // 接收客户端发送的消息
                    String clientMessage = reader.readLine();

                    // 如果客户端发送的消息为"bye",则退出循环
                    if (clientMessage.equals("bye")) {
                        break;
                    }

                    System.out.println("接收到的消息: " + clientMessage);

                    // 发送消息给客户端
                    writer.println("已接收到消息:" + clientMessage);
                }

                // 关闭连接
                clientSocket.close();
                serverSocket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

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

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

相关文章

第二十一章博客

计算机应用实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议…

C++面试宝典第9题:找出第K大元素

题目 给定一个整数数组a,同时给定它的大小N和要找的K(1 <= K <= N),请根据快速排序的思路,找出数组中第K大的数(保证答案存在)。比如:数组a为[50, 23, 66, 18, 72],数组大小N为5,K为3,则第K大的数为50。 解析 这道题主要考察应聘者对于快速排序的理解,以及实…

开源项目解读 —— Self-Operating Computer Framework # 长期主义 # 价值

价值&#xff1a;生成主函数业务逻辑函数思维导图&#xff0c;帮助理解&#xff0c;PR到开源项目&#xff0c;希望帮助大家理解IPA工作原理&#xff0c;国内没有好的开源项目&#xff0c;我就来翻译分析解读&#xff0c;给大家抛砖引玉。思维导图用文心一言配合其思维导图插件实…

算法基础之数字三角形

数字三角形 核心思想&#xff1a;线性dp 集合的定义为 f[i][j] –> 到i j点的最大距离 从下往上传值 父节点f[i][j] max(f[i1][j] , f[i1][j1]) w[i][j] 初始化最后一层 f w #include <bits/stdc.h>using namespace std;const int N 510;int w[N][N],f[N][…

Dash中 基本的 callback 5

app.callback 在Dash中&#xff0c;app.callback 被用于创建交互性应用程序&#xff0c;它用于定义一个回调函数&#xff0c;该函数在应用程序中发生特定事件时被触发。回调函数可以修改应用程序的布局或更新图表等内容&#xff0c;从而实现动态交互。 下面是一个简单的 app.…

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…

Plantuml之序列图语法介绍(十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Rust与AI】LLM模型基本架构

本篇是《Rust与AI》系列的第二篇&#xff0c;上一篇我们主要介绍了本系列的概览和方向&#xff0c;定下了一个基调。本篇我们将介绍LLM的基本架构&#xff0c;我们会以迄今为止使用最广泛的开源模型LLaMA为例展开介绍。 LLM背景 Rust 本身是不挑 AI 模型的&#xff0c;但是 LLM…

Java进阶(第六期): Arrays类(数组工具)、冒泡排序、选择排序、二分查找、【正则表达式】、Java正则爬取信息

文章目录 一、Arrays1.1代码示例&#xff1a; 二、冒泡排序2.1 代码示例 三、选择排序3.1 代码示例 四、二分查找4.1 代码示例 &#xff08;这里采用乱序数组&#xff09; 五、正则表达式5.1 正则表达式的基本使用5.2 正则表达式爬取信息练习 Java进阶&#xff08;第六期&#…

vue3(七)-基础入门之事件总线与动态组件

一、事件总线 事件总线使用场景&#xff1a; 两个兄弟组件之间的传参&#xff0c;或者两个没有关联的组件之间的传参 html &#xff1a;引入 publicmsg 与 acceptmsg 自定义组件 (自定义组件名称必须小写) <body><div id"app"><publicmsg></…

CGAL的三维点集

CGAL提供了几种处理点集的算法&#xff0c;从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构&#xff0c;但该软件包提供了一个3D点集结构&#xff0c;使用户更容易处理附加属性&#xff0c;如法向量、颜色、标签&#xff0c;并在其上调…

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展&#xff0c;越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统&#xff08;ADAS&#xff09;中的横向辅助驾驶进行深入研究。在这项研究中&#xff0c;LabVIEW作为一个强大的系…

数禾使用 Knative 加速 AI 模型服务部署丨KubeCon China 2023

作者&#xff1a;李鹏&#xff08;阿里云&#xff09;、魏文哲&#xff08;数禾科技&#xff09;&#xff0c; 此文基于 KubeCon China 2023 分享整理 摘要 AI 服务的数据、训练、推理等都需要消耗大量的计算资源以及运维成本&#xff0c;在数禾科技的金融业务场景下&#xf…

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

遇到DDOS怎么办,盾真的可以抗攻击吗

网络在以难以想象的速度发展&#xff0c;黑客们针对网络漏洞发起的攻击也从未停止&#xff0c;但复杂的网络环境让网络安全的维护更为艰难&#xff0c;如果游戏公司没有做好防御措施&#xff0c;黑客发起攻击只是时间问题。在网络攻击愈加多元化的今天&#xff0c;游戏行业可以…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

图解二叉树的Morris(莫里斯)遍历

二叉树的Morris(莫里斯)遍历 本文参考链接&#xff1a;https://leetcode.cn/problems/binary-tree-preorder-traversal/submissions/490846864/ 文章目录 二叉树的Morris(莫里斯)遍历模板代码前序遍历中序遍历后序遍历 Morris 遍历使用二叉树节点中大量指向 null 的指针&…

Apache Commons CLI:构建命令行应用的利器

引言 大家好&#xff01;我是小黑&#xff0c;本文聊聊如何用Apache Commons CLI构建命令行应用。咱们都知道&#xff0c;命令行界面&#xff08;CLI&#xff09;虽然看起来不如图形界面那么花哨&#xff0c;但在许多场景下&#xff0c;它的效率和便利性是无与伦比的。特别是对…

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…

uni-app之HelloWorld实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…