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架构相关推荐

  1. python cs开发框架_用Python编写一个简单的CS架构后门的方法

    用Python编写一个简单的CS架构后门的方法 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  用Python编写一个简单的CS架构后门的方法.txt ] (友情 ...

  2. java可以做cs架构吗_cs架构能用云服务器么(常用cs架构应用)

    我看了不少云服务器都是支持PHP要不就是java的,那支持C++开发的cs架构. 如你所述,据我所知 新浪的SAE的云服务器只支持php,python和jsp这三种脚本语言.目前需要付月租费的腾讯云服 ...

  3. python开发cs软件_python cs架构实现简单文件传输

    本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下 要实现简单文件的传输我们必须考虑这些问题: 1.什么是c/s架构? 顾名思义,就是客户端端/服务器架构.不同的人 ...

  4. Java网络编程案例--CS模型的简单实现

    Java网络编程案例–CS模型的简单实现 Java网络编程案例CS模型的简单实现 基本概述 程序原理图 源代码 基本概述 该程序采用C/S模型,在服务器端简单的建立了一个多线程类,来实现对多个客户端传 ...

  5. BS1036-基于java+路径规划+CS架构实现的A星算法求解最短路径问题演示程序

    本基于java+路径规划+CS架构实现的A星算法求解最短路径问题演示程序,系统采用多层C/S软件架构,采用java 编程语言开发技术实现A*算法求解地图中的最短路径问题,实时获取计算用户在地图中设置的 ...

  6. cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析

    一.简介  CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.但是该结构的程序是 ...

  7. 渗透测试-CS架构客户端

    网络架构模式 B/S和C/S都是随着互联网的发展而出现的一种网络结构模式,而其用的非常广泛,在我们生活中都很常见.那它们到底是什么呢?接下来就详细的介绍一下B/S和C/S. B/S架构 B是英文单词& ...

  8. Java选择题简单的考试系统

    Java选择题简单的考试系统 做前声明: 此系统包括了Java中:面向对象-封装.String-StringBuilder.ArrayList集合.继承-抽象-final.static-接口-多态.四 ...

  9. 基于CS架构的鸿蒙应用|图片风格样式迁移程序

    转自https://www.ailovejinx.top:5800/index.php/archives/7/ 本项目基于CS架构,利用Java语言,在鸿蒙开发工具DevEco Studio中开发了一 ...

  10. java 多用户B2B2C商城系统架构之第四篇:构建高并发高可用的电商平台架构实践

    如果需要商城系统,请联系下方微信 一.设计理念 注:这里只讲概念,尽量不讲技术!但是会推荐一些.本博客虽然是基于java语言,但是适用于任何其他大型架构系统. 1.空间换时间 1)多级缓存.静态化 关 ...

最新文章

  1. 宇泽电影工作室网页HTML语言,4.4宇泽国际旅行社网页制作
  2. SAP HANA ANY和ALL关键字
  3. VTK:相互作用之TrackballActor
  4. 19-for循环语句
  5. 我们在雪地撒野——51cto众人滑雪图片集
  6. 论文浅尝 - WWW2020 | 通过对抗学习从用户—项目交互数据中挖掘隐含的实体偏好来用于知识图谱补全任务...
  7. 获奖者:舒继武,男,清华大学计算机系教授、博士生导师,教育部长江学者特聘教授,国家杰出青年基金获得者,《大数据》杂志编委。...
  8. ng service(服务)
  9. platform总线注册过程及platform_driver与platform_device的匹配
  10. C# dataGridView控件 获取整行宽度 整列高度 设置某列宽度 设置某行高度
  11. xp的服务器系统怎么安装系统安装,XP系统怎么安装SQL Server 2000数据库
  12. lcd12864资料
  13. 计算机职业规划范文300字,我的职业生涯规划,300字
  14. js实现简易打点计时器
  15. docker的/var/run/docker.sock参数
  16. 如何把很多照片拼成一张照片_把很多小照片拼成一张大照片是怎么做的?
  17. mysql error 1148_MYSQL:ERROR 1148: The used command is not allowed with this MySQL version
  18. 数据指标体系如何从设计到落地
  19. MySQL与Python最详细的使用文档
  20. EV3 直接命令 - 第 3 课 遥控车辆

热门文章

  1. html div与span同行,div和span在一行 div和Span及a标签的区别
  2. 软件测试的环境部署怎么做?
  3. 有教学用计算机,在计算机教学中运用有效教学方法初探
  4. besiege机器人_围攻besiege机器人 机器人制作思路
  5. 国美易卡的标识符和关键字是什么(国美易卡)
  6. 【密码学基础】06 高级加密标准AES
  7. HashMap初始容量指定规则
  8. SSA静态单赋值概念理解
  9. sns_sensor_instance_api
  10. html手机支付案例,实例讲述Ecshop实现的支付宝手机网页支付功能