用java实现内网通讯,可多开客户端链接同一个服务器

创建一个客户端:package Socket;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;/*
聊天案例客户端
*/
public class Client {private Socket socket;/** 构造方法用于初始化客户端* */public Client() {try {/** 实例化Socket时需要指定两个信息* 1、服务端Ip地址,如果链接的是本机,则使用localhost即可* 2、服务端口,用来找到运行在服务端计算机上的服务端应用程序** 实例化Socket的过程就是与服务端建立连接的过程,如果链接失败* 则会抛出异常* */System.out.println("正在链接服务端。。。");socket= new Socket("localhost",8088);System.out.println("与服务端建立链接成功!");} catch (IOException e) {e.printStackTrace();}}/** 客户端开始工作的方法* */public void start(){try {/*Socket提供的重要方法:OutputStream getOutputStream()* 该方法用于获取一个字节输出流,用于向服务端发送数据* */OutputStream outputStream=socket.getOutputStream();/*//向服务端发送一个字节数据:00000001outputStream.write(1);*/while (true){System.out.println("输入要发送的内容:");Scanner scan=new Scanner(System.in);String str= scan.nextLine();if ("exit".equalsIgnoreCase(str)){break;}//用字符串表示发送的内容//String str="你能学会java吗?";//将字符串转换成字节数组byte[] data=str.getBytes(StandardCharsets.UTF_8);//先给服务端发送字节数组的字节数量,也就是要发送多少字节outputStream.write(data.length);//在将字符串转换的所有字节发送给服务端outputStream.write(data);}} catch (IOException e) {e.printStackTrace();}finally {try {/** 当通讯完毕时,希望与对方断开链接应当调用close方法* 1、close方法会关闭字节输入流和字节输出流* 2、与对方进行四次挥手* */socket.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {Client client=new Client();client.start();}
}创建一个服务端:

package Socket;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*
* 聊天程序服务端
* */
public class Server {/**运行在服务端的ServerSocket* 主要工作:* 1、向系统申请服务端口* 2、监听该端口,一旦客户端通过该端口尝试链接则创建Socket与客户端建立链接*/private ServerSocket serverSocket;private ExecutorService threadPool;/** 构造方法* */public Server(){try {System.out.println("正在启动!");serverSocket=new ServerSocket(8088);threadPool= Executors.newFixedThreadPool(20);System.out.println("启动完成");} catch (IOException e) {e.printStackTrace();}}public void start(){/** accept: 接受** ServerSocket提供的方法:accept用于接受客户端的链接该方法是一个阻塞方法,调用后程序"卡主",开始等待客户端的链接,一旦一个客户端链接,该方法会立即返回一个Socket对象用于与该客户端进行数据交互。* */try {while (true){System.out.println("等待客户端链接");Socket socket = serverSocket.accept();System.out.println("一个客户端已连接");//启动一个线程来处理该客户端交互ClientHandler handler=new ClientHandler(socket);/* Thread t=new Thread(handler);t.start();*/threadPool.execute(handler);}} catch(IOException e){e.printStackTrace();}}public static void main(String[] args) {Server server=new Server();server.start();}private class ClientHandler implements Runnable{private Socket socket;public ClientHandler(Socket socket){this.socket=socket;}public void run(){/** Socket提供的额方法:* InputStream getInputStream()* 获取该Socket的输入流,用于读取对方发送的信息* */try {InputStream inputStream = socket.getInputStream();//读一个字节,得知客户端后续发送了多少个字节int len;/** 通过网络流读取对方发送过来的一个字节数据时* 如果返回值为-1仍然是表达流读取到了末尾,此时只有当客户端正常断开* 链接(进行了四次挥手时)read读到了-1* */while ((len=inputStream.read())!=-1) {//创建字节数组,存储客户端发送的字节byte[] data = new byte[len];//读数据inputStream.read(data);//将数据转换成字符串String message = new String(data, StandardCharsets.UTF_8);System.out.println("客户端内容:" + message);}} catch (IOException e) {e.printStackTrace();}}}
}

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

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

相关文章

node 后端和浏览器前端,有关 RSA 非对称加密的完整实践, 前后端匹配的代码演示

前言 前天,写了一篇文章《我设计的一个安全的 web 系统用户密码管理流程》,里面提到了有关非对称加密 RSA 的一些事情。思想归思想,实践要重于理论,所以我想趁周末,来完成这个时间。 结果发现现实比理想要困难许多,这…

【自然语言处理与大模型】Windows安装RAGFlow并接入本地Ollama模型

本文给大家带来一个实用的RAG框架——RAGFlow。我们来看看它的自我介绍吧! 还是老规矩,它是什么?有什么用?这些官方文档都可以简单的查到(官方中文README_zh.md)。下面我带大家一步步安装并实现一个知识库问…

MySQL 自启动时报错can‘t create PID file: No such file or directory

系统版本:Red Hat Enterprise Linux Server release 7.0 MySQL版本:5.7.16-1.el6.x86_64 安装MySQL后,设置好了开机自启动。 但是重启服务器后,MySQL并没有启动,查看日志如下: 2018-04-13T06:27:24.608793…

Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持

引言 Apache Flink 社区很开心地宣布,在经过4个月的版本开发之后,Flink CDC 3.4.0 版本已经正式发布。Flink CDC 是流行的流式数据集成框架,CDC 3.4.0 版本强化了框架对于高频表结构变更的支持,框架支持了 batch 执行模式&#x…

Flink SQL、Hudi 、Doris在数据上的组合应用

Flink SQL、Hudi 和 Doris 是大数据领域中不同定位的技术组件,各自解决不同的问题,以下从核心定位、关键特性和典型场景三个维度展开说明: 1. Flink SQL:流批统一的实时计算引擎 核心定位:Flink 是 Apache 顶级的流批…

如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破

在实时音视频传输中,低延迟是直播应用的核心技术要求之一。无论是在线教育、远程医疗,还是实时互动直播,延迟过大会影响用户体验,甚至导致应用无法正常使用。大牛直播SDK(SmartMediaKit)在RTSP和RTMP播放器…

upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)

目录 一、图片马 二、文件包含 三、文件包含与图片马 四、图片马制作方法 五、源码分析 六、制作图片马 1、创建脚本并命名为test.php 2、准备制作图片马的三类图片 3、 使用copy命令制作图片马 七、渗透实战 1、GIF图片马渗透 (1)上传gif图…

基于区块链的茅台酒溯源系统:设计方案、应用实例及未来展望

一、项目背景与需求 茅台酒,作为中国白酒的瑰宝,以其深厚的历史底蕴和独特的酿造工艺享誉全球。然而,市场上假冒伪劣产品的泛滥,不仅严重损害了消费者的权益,也对茅台酒的品牌声誉造成了巨大冲击。为了解决这一问题&a…

openCV1.1 Mat对象

imread(“D:\souse\duoxile.jpg”, IMREAD_COLOR); 功能: 从指定路径读取图像文件并解码为OpenCV的Mat对象 第一个参数: 文件路径 类型: const string&描述: 要读取的图像文件的绝对或相对路径示例: “D:\souse\duoxile.jpg” 或 “./images/test.png”第二个参数: 读取模…

java day14

接昨天,响应 响应 就是我们在处理请求的时候,里面的return 其实方法里面写的return的返回平常的什么字符串啊什么等等;这些东西都是直接返回;如果是一个对象的话,我们会按json的格式返回; 这些都依赖于一…

【软件设计师】计算机网络考点整理

以下是软件设计师考试中 ​​计算机网络​​ 的核心考点总结,帮助您高效备考: ​​一、网络体系结构与协议​​ ​​OSI七层模型 & TCP/IP四层模型​​ 各层功能(物理层-数据链路层-网络层-传输层-会话层-表示层-应用层)对应协…

基于深度学习的工件检测系统设计与实现

在工业自动化领域,工件检测一直是提高生产效率和产品质量的关键环节。传统的人工检测方法不仅效率低下,而且容易受到主观因素的影响,导致误判率较高。随着深度学习技术的飞速发展,基于图像识别的自动检测系统逐渐成为研究热点。今…

IIS入门指南:原理、部署与实战

引言:Web服务的基石 在Windows Server机房中,超过35%的企业级网站运行在IIS(Internet Information Services)之上。作为微软生态的核心Web服务器,IIS不仅支撑着ASP.NET应用的运行,更是Windows Server系统管…

Linux周测(一)

提示:学习一周了,来检验一下成果吧 文章目录 技术部分,满分100分。 1.如何在Linux系统中查看当前登录的所有用户信息? w或者who或者last 2.请写出在Linux系统中创建一个新用户“testuser”的命令,并指定其家目录为“/h…

构建下一代AI智能体:基于Spring AI的多轮对话应用

构建下一代AI智能体:基于Spring AI的多轮对话应用 前言 大模型时代,AI应用开发已不再是遥不可及的技术。通过合理设计的Prompt工程和对话架构,开发者可以快速构建具备持续记忆能力的AI智能体。本文将重点介绍如何基于Spring AI框架打造可持…

查看mysql配置文件my.cnf的位置

3.删除mysql相关文件 想要完全卸载mysql,不仅要卸载应用,配置文件及相关文件也需要一一清除,还原环境配置,减少一些麻烦。 sudo rm -rf /usr/local/mysql sudo rm -rf /etc/my.cnf sudo rm -rf /var/db/mysql sudo rm -rf /var/…

【从基础到模型网络】深度学习-语义分割-基础

语义分割在深度学习与人工智能领域占据重要地位。它是计算机视觉的核心任务之一,能够将图像像素级地划分为不同语义类别,为理解图像内容提供关键支持。在自动驾驶中,可精准识别道路、车辆、行人等元素,保障行车安全;在…

C++:array容器

array容器是序列容器&#xff0c;它的特点是&#xff1a;静态&#xff0c;固定数目。可以看作更安全的数组。 它还有一些成员函数&#xff0c;如begin&#xff08;&#xff09;&#xff1a;返回指向容器中第一个元素的随机访问迭代器。 #include<iostream>//数组容器 #…

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p42178 过去一年&#xff0c;消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元&#xff0c;实物商品网零额占比27%&#xff0c;线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…

[Web服务器对决] Nginx vs. Apache vs. LiteSpeed:2025年性能、功能与适用场景深度对比

更多服务器知识&#xff0c;尽在hostol.com 当你准备为你的网站或应用程序选择一款 Web 服务器软件时&#xff0c;就像是为你的“超级跑车”选择一款合适的“引擎”——它将直接决定你的“座驾”能跑多快、多稳、以及能适应什么样的“路况”&#xff08;工作负载&#xff09;。…