java实现简单的 cs架构
1.首先放上我项目目录(java原生 不需要第三方依赖)
1.首先代码我一一附上
(1)StartServer.java
import java.net.ServerSocket;
import java.net.Socket;public class StartServer {// 服务端的启动类public static void main(String[] args) {// 服务端try{//创建服务器socket连接ServerSocket serverSocket=new ServerSocket(18889);//这里写成while循环 是为了 让一个客户端连接后 另一个客户端还可以连接int i=0;while(true){Socket socket=serverSocket.accept();new SocketServerThread(socket).start();i++;System.out.println("当前有"+i+"个客户端,与服务器建立了连接。");}}catch(Exception e){e.printStackTrace();}}
}
(2)StartClient.java
import java.net.Socket;public class StartClient {// 客户端的启动类public static void main(String[] args) {
// 这里 我启动了两个客户端 便于测试 一般写一个就可以了//客户端1try{//创建socket连接 服务器的地址是127.0.0.1:18889Socket socket=new Socket("127.0.0.1",18889);//启动客户端new SocketClient(socket).startSocketClient();}catch(Exception e){e.printStackTrace();}//客户端2try{//创建socket连接 服务器的地址是127.0.0.1:18889Socket socket=new Socket("127.0.0.1",18889);//启动客户端new SocketClient(socket).startSocketClient();}catch(Exception e){e.printStackTrace();}}}
(3)SocketUtils.java
public class SocketUtils {
// cs架构的 工具类 后续可以根据自己的需求 写工具方法public static final String streamEncoding = "utf-8";
}
(4)SocketServerThread.java
import java.io.*;
import java.net.Socket;//服务器线程类
public class SocketServerThread extends Thread{private Socket socket;public SocketServerThread(Socket socket){this.socket=socket;}public Socket getSocket() {return socket;}public void setSocket(Socket socket) {this.socket = socket;}@Overridepublic void run(){
// 这里写成循环 是因为 如果不写循环 处理发生错误 本条线程就结束 也就和客户端失去了联系
// 写成循环 只要socket对象存在 InputStreamReader OutputStreamWriter 就可以重新建立 继续发送接受消息while (true){try{//从socket获取 接收 和发送消息的流BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream(), SocketUtils.streamEncoding));BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), SocketUtils.streamEncoding));//从客户端接收消息 这里需要注意
// 这里的循环 只要没有出现Exception 用户和客户端的连接没有断开 下面这个循环 就不会终止
// 以前 我以为 服务端每接收一条消息然后回复出去 这个while就会终止 但实际不是这样的 这个InputStream 和 OutputStream 是一直保持连接的
// 是需要一直循环 从里面获取消息和发送消息的String line = "";while((line = bfr.readLine())!=null){bfw.write("我已收到你的消息【"+line+"】");bfw.newLine();bfw.flush();System.out.println("接收到了客户发来的消息:"+line);System.out.println("同时向客户端回复了:我已收到你的消息【"+line+"】");}}catch(Exception e){System.out.println("连接断开!");if(socket!=null){try{if(!socket.isClosed()){socket.close();}} catch (IOException ioException) {ioException.printStackTrace();}}break;}}}}
(5)SocketClient.java
import java.net.Socket;public class SocketClient {private Socket socket;public SocketClient(Socket socket) {this.socket = socket;}// 对于客户端来说 启动客户端 就需要启动两个线程 一个是发送线程 一个是接收线程 因为
// 发送消息后 需要等待 服务端回消息 在等待过程中 就需要接收线程监听 与此同时 发送线程还可以继续发送消息
// 对于服务端而言 就只需要一条线程 即 接受到客户端消息-》处理-》回复public void startSocketClient(){try{new SocketClientSendThread(socket).start();new SocketClientReceiveThread(socket).start();}catch(Exception e){e.printStackTrace();}}
}
(6)SocketClientSendThread.java
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;//向服务端发送消息线程
public class SocketClientSendThread extends Thread{private Socket socket;public SocketClientSendThread(Socket socket){this.socket=socket;}@Overridepublic void run(){while (true){try{
// 等待3秒Thread.sleep(3000);
// 然后把信息写到 OutputStream 流里面 然后服务器就能从这个流里读取数据String send = "客户(线程)"+Thread.currentThread().getName()+"向 \n 服务器发送消息。";BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bfw.write(send);bfw.newLine();bfw.flush();System.out.println("给服务端发送的信息:"+send);}catch(Exception e){System.out.println("链接断开");if(socket!=null){try{if(!socket.isClosed()){socket.close();}} catch (IOException ioException) {ioException.printStackTrace();}}break;}}}
}
(7)SocketClientReceiveThread.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;// 客户端接收线程
public class SocketClientReceiveThread extends Thread{private Socket socket;public SocketClientReceiveThread(Socket socket){this.socket=socket;}@Overridepublic void run(){
// 这个循环也是 只要socket存在 出现异常 也会立即新建 InputStream接收流 及时获取服务器的信息while(true){try{
// 服务端会把回复消息写到 这个InputStream 流里面
// 这里客户端从这里就能获取服务端回复的消息BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream(), SocketUtils.streamEncoding));String line = "";
// 同服务端一样 这里的循环只要连接保持 这个循环就不会终止 需要一直遍历 从里面 读取服务端消息while((line = bfr.readLine())!=null){System.out.println("接收到服务器回复过来的消息:"+line);}}catch(Exception e){System.out.println("链接断开");if(socket!=null){try{if(!socket.isClosed()){socket.close();}} catch (IOException ioException) {ioException.printStackTrace();}}break;}}}
}
2.系统的各种解释 我已经在代码的注释里写清楚了 但是这里有一点需要注意
我从流里读取消息使用的是 .readLine() 也就是一行读取一次,默认 一行就是一个消息,如果你一个消息里有个 \n 回车 他就会当作两个消息处理 所以使用的时候要注意,
这里我提供两个建议 1.客户端和服务端发送消息时候 替换 \n 为其他字符 输出时候再替换回来
2.将 BufferedReader 替换为其他输入流 一次性读取所有的消息 例如.read(new byte[2048])
如果代码里有不懂的地方 欢迎评论区留言。
java实现简单的 cs架构相关推荐
- python cs开发框架_用Python编写一个简单的CS架构后门的方法
用Python编写一个简单的CS架构后门的方法 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 用Python编写一个简单的CS架构后门的方法.txt ] (友情 ...
- java可以做cs架构吗_cs架构能用云服务器么(常用cs架构应用)
我看了不少云服务器都是支持PHP要不就是java的,那支持C++开发的cs架构. 如你所述,据我所知 新浪的SAE的云服务器只支持php,python和jsp这三种脚本语言.目前需要付月租费的腾讯云服 ...
- python开发cs软件_python cs架构实现简单文件传输
本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下 要实现简单文件的传输我们必须考虑这些问题: 1.什么是c/s架构? 顾名思义,就是客户端端/服务器架构.不同的人 ...
- Java网络编程案例--CS模型的简单实现
Java网络编程案例–CS模型的简单实现 Java网络编程案例CS模型的简单实现 基本概述 程序原理图 源代码 基本概述 该程序采用C/S模型,在服务器端简单的建立了一个多线程类,来实现对多个客户端传 ...
- BS1036-基于java+路径规划+CS架构实现的A星算法求解最短路径问题演示程序
本基于java+路径规划+CS架构实现的A星算法求解最短路径问题演示程序,系统采用多层C/S软件架构,采用java 编程语言开发技术实现A*算法求解地图中的最短路径问题,实时获取计算用户在地图中设置的 ...
- cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析
一.简介 CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.但是该结构的程序是 ...
- 渗透测试-CS架构客户端
网络架构模式 B/S和C/S都是随着互联网的发展而出现的一种网络结构模式,而其用的非常广泛,在我们生活中都很常见.那它们到底是什么呢?接下来就详细的介绍一下B/S和C/S. B/S架构 B是英文单词& ...
- Java选择题简单的考试系统
Java选择题简单的考试系统 做前声明: 此系统包括了Java中:面向对象-封装.String-StringBuilder.ArrayList集合.继承-抽象-final.static-接口-多态.四 ...
- 基于CS架构的鸿蒙应用|图片风格样式迁移程序
转自https://www.ailovejinx.top:5800/index.php/archives/7/ 本项目基于CS架构,利用Java语言,在鸿蒙开发工具DevEco Studio中开发了一 ...
- java 多用户B2B2C商城系统架构之第四篇:构建高并发高可用的电商平台架构实践
如果需要商城系统,请联系下方微信 一.设计理念 注:这里只讲概念,尽量不讲技术!但是会推荐一些.本博客虽然是基于java语言,但是适用于任何其他大型架构系统. 1.空间换时间 1)多级缓存.静态化 关 ...
最新文章
- 宇泽电影工作室网页HTML语言,4.4宇泽国际旅行社网页制作
- SAP HANA ANY和ALL关键字
- VTK:相互作用之TrackballActor
- 19-for循环语句
- 我们在雪地撒野——51cto众人滑雪图片集
- 论文浅尝 - WWW2020 | 通过对抗学习从用户—项目交互数据中挖掘隐含的实体偏好来用于知识图谱补全任务...
- 获奖者:舒继武,男,清华大学计算机系教授、博士生导师,教育部长江学者特聘教授,国家杰出青年基金获得者,《大数据》杂志编委。...
- ng service(服务)
- platform总线注册过程及platform_driver与platform_device的匹配
- C# dataGridView控件 获取整行宽度 整列高度 设置某列宽度 设置某行高度
- xp的服务器系统怎么安装系统安装,XP系统怎么安装SQL Server 2000数据库
- lcd12864资料
- 计算机职业规划范文300字,我的职业生涯规划,300字
- js实现简易打点计时器
- docker的/var/run/docker.sock参数
- 如何把很多照片拼成一张照片_把很多小照片拼成一张大照片是怎么做的?
- mysql error 1148_MYSQL:ERROR 1148: The used command is not allowed with this MySQL version
- 数据指标体系如何从设计到落地
- MySQL与Python最详细的使用文档
- EV3 直接命令 - 第 3 课 遥控车辆