C/S 架构全称为客户端
/
服务器体系结构,它是一种网络体系结构,其中客户端是用户运行应用程序的
PC
端或
者工作站,客户端要依靠服务器来获取资源。
C/S
架构是通过提供查询响应而不是总文件传输来减少了网络流
量。它允许多用户通过
GUI
前端更新到共享数据库,在客户端和服务器之间通信一般采用远程调用
RPC 或标准查询语言
SQL
语句。
C/S 架构的基本特征:胖客户端应用
1、客户端进程包含特定于解决方案的逻辑,并提供用户与应用程序系统其余部分之间的接口。服务器进程充当管理共享资源(如数据库,打印机,调制解调器或高性能处理器)的软件引擎。
2、前端任务和后端任务对计算资源有着根本不同的要求,例如处理器速度,内存,磁盘速度和容量以及输入
/输出设备。
3、客户端和服务器的硬件平台和操作系统通常不相同。客户端和服务器进程通过一组明确定义的标准应用程序接口
API
和
RPC
进行通信。
C/S 架构的一个重要特征是可扩展性,它们可以水平或垂直缩放。水平扩展意味着添加或删除客户端,工作站只会对性能产生轻微影响。垂直扩展意味着迁移到更大更快的服务器计算机或多服务器中。
服务器端套路
1、创建
ServerSocket
对象,绑定监听端口。
2、通过
accept
方法监听客户端请求。
3、连接建立后,通过输入流读取客户端发送的请求信息。
4、通过输出流向客户端发送响应信息。
5、关闭响应的资源。
public class TimeServer {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8080);
//打开服务器的监听端口,客户端需要和服务器连接则必须确定端口号
Socket accept = serverSocket.accept();
//阻塞当前进程,等待客户端的连接请求,如果连接创建成功则获取一个 Socket 对象
//具体的处理逻辑
InputStream is=accept.getInputStream();
OutputStream os=accept.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//针对字节流进行包装,简化编程
String str=br.readLine();
//从输入流中获取客户端发送的数据,如果客户端发送的数据没有到达,则阻塞等待。接收到客户端发送的数据则将接收的数据返回
System.out.println("Server:"+str);
Date now=new Date();
//JDK1.8-版本的日期类型,当前一般建议使用 JDK1.8 引入的日期类型
LocalDate... DateFormat df=new SimpleDateFormat("yyyy 年 M 月 d 日 E HH 点 mm 分 ss 秒");
PrintWriter out=new PrintWriter(os);
out.println("现在是:"+df.format(now));
out.flush();
accept.close();
serverSocket.close();
}
}
客户端套路
1、创建
Socket
对象,指明需要连接的服务器的地址和端口号。
2、连接建立后,通过输出流向服务器发送请求信息。
3、通过输入流获取服务器响应的信息。
4、关闭相应资源。
public class HelloClient {
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 8080);
//客户端发起连接请求,参数1为服务器的地址,参数2为连接端口号,也就是服务器的监听端口号
InputStream is= client.getInputStream();
OutputStream os= client.getOutputStream();
PrintWriter out=new PrintWriter(os);
//PrintWriter(OutputStream out, boolean autoFlush) 如果需要自动刷新缓冲区,则构建时可以添加 boolean 类型参数
out.println("Hello Server!"); //客户端向服务器发送字符串数据
out.flush();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//客户端接收服务器的响应信息,如果服务器没有发送,则阻塞等待
String res=br.readLine();
System.out.println("Client:"+res);
client.close();
}
}