cs是一种重要的网络计算机模式_cs在计算机代表啥

cs是一种重要的网络计算机模式_cs在计算机代表啥开始之前,先大概说一下吧。计算机网络研究的是理论,讲究的是网络过程中的连接方式,还有协议制定的原因,为什么这么指定,它不是一个简单的敲代码,做码农就好了的,关键是在于创新,先是理解协议为什么这么制定,要怎么样才可以更加好的指定出下一个协议,怎么才可以做出一个好的东西。什么是cscs即:client/server,是服务器客户端结构。是一种“一对多”的模式,一台服务器,处理多个客户端发来的请求,……

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

开始之前,先大概说一下吧。计算机网络研究的是理论,讲究的是网络过程中的连接方式,还有协议制定的原因,为什么这么指定,它不是一个简单的敲代码,做码农就好了的,关键是在于创新,先是理解协议为什么这么制定,要怎么样才可以更加好的指定出下一个协议,怎么才可以做出一个好的东西。

什么是cs

cs即:client/server,是服务器客户端结构。是一种“一对多”的模式,一台服务器,处理多个客户端发来的请求,完成了业务逻辑之后,再返回给客户端一些信息。其中,服务器不会主动发起请求,都是被动处理的,像一头牛,拉一下绳子走几步;而客户端则主要是提供一个界面,给你点击一些功能按钮,其实每一个按钮就是一个请求,发送到服务器中给你实现这个请求,再把结果返回给你。就像你有一道数学题目不会,打开客户端(一个app,或者exe)然后输入你的问题,点击解答按钮,就有一个请求通过网络到了服务器,服务器做出了这道题,把答案返回给你,你的客户端界面再显示出这道题的答案,这就是所谓的cs模式的工作流程了。(小猿搜题之类的就是这么个流程了)

socket

socket是一种实现网络连接的方式,通过两台电脑一边一个socket嵌套字,在两台电脑(一台服务器,一台主机)之间建立通道,然后他们就可以传输数据了。这其实是一种思想的具体化,网络通信理论提出了要连接两个电脑,就需要这么个东西去实现功能,人们把它设计出来,就命名为嵌套字。
所以,代码什么的,只是一种实现,谁都可以,记住,一个好的计算机科学家,不是只能实现,而是要有想法,实现什么的,只要你的理论没有漏洞,是不会出现bug的。出现了,也是语言底层设计本身有问题,不是你的错。
那么,下面说一下简单的socket应用吧:
第一个是实现回声的cs代码:所谓回声,就是客户端发什么信息xxxx,服务器就回复一个:我是服务器,我收到了你的信息:xxxx。
代码如下,java实现;

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class server { 
   
 //设置端口号/
 public static int portNo=3333;
 public static void main(String[] args) throws IOException { 
   
  //初始化serverSocket类
  ServerSocket s=new ServerSocket(portNo);
  System.out.println("The Server is starting...");
  //建立socket连接(阻塞,直到有客户端连接)
  Socket socket=s.accept();
  //接收数据
  try{ 
   
   //构造输入流缓存
   BufferedReader bufReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
   PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
   String time=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());
   while(true){ 
   
       //按行读取输入内容
    String strLine=bufReader.readLine();
    //如果收到byebye则退出循环
    if(strLine.equals("byebye")){ 
   
     break;
    }
    System.out.println("In the Server reveived the info: "+strLine);
    //向客户端发送接收到的数据
    System.out.println("The server is send the received msg to the client...");
    out.println("The received msg is: "+strLine+" and The time is:"+time);
    
   }
  }catch(Exception e){ 
   
   e.printStackTrace();
  }finally{ 
   
   System.out.println("close the Server socket and the io");
   //关闭socket,断开连接
   socket.close();
   s.close();
  }

 }

}

客户端

import java.io.*;
import java.net.*;

public class client { 
   

 /** * @param args */
 public static String clientName="laughcry";
 //设置端口号
 public static int portNo=3333;
 public static void main(String[] args) throws IOException { 
   
  // TODO Auto-generated method stub
  //设置连接地址类,连接本地,描述使用本socket的ip地址
  InetAddress addr=InetAddress.getByName("localhost");
  //初始化socket类
  Socket socket=new Socket(addr,portNo);
  try{ 
   
   System.out.println("socket="+socket);
   //设置io句柄
   BufferedReader bufReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
   PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
   //向服务器端发送数据
   out.println("Hello server ,I am "+clientName);
   //接受服务器返回的信息
   String str=bufReader.readLine();
   System.out.println("The msg from server is: "+str);
   out.println("byebye");
  }catch(Exception e){ 
   
   e.printStackTrace();
  }finally{ 
   
   //关闭连接
   System.out.println("close the client socket and the io.");
   socket.close();
  }

 }

}

这个例子只是在一台电脑上开两个程序,然后client访问server而已。是用来理解一下socket的,之后的这个才是通常的cs架构应有的一对多功能,基于第一个代码加一个多线程处理就好了。

先是客户端

import java.io.*;
import java.net.*;
import java.net.Socket;
import java.util.Scanner;

public class client{ 
   
    public static int portNo=14444;
    public static String myname="2号";

    public static void main(String[] args) throws IOException { 
   
        InetAddress addr = InetAddress.getByName("localhost");
        Socket s=new Socket("10.21.22.116",portNo);//第一个参数是你的服务器的ip号,在cmd终端输入ipconfig,找到ipv4对应的就好了。
        System.out.println(s.getInputStream());
        System.out.println(s.getOutputStream());

        System.out.println("socket=" + s);
        try { 
   
            BufferedReader bufRead=new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
            out.println("Hello server ,I am " + myname);
            while (true) { 
   
                String line= bufRead.readLine();
                System.out.println("接收到服务器回复:"+line);
                System.out.println("开始输入");
                Scanner scanner=new Scanner(System.in);
                out.println(scanner.nextLine());
            }
        } catch (IOException e) { 
   
            e.printStackTrace();
        }finally { 
   
            s.close();
        }

    }
}

然后是服务器了,下面是开了多线程的服务器,原理如下图:
在这里插入图片描述
关键是红色字体部分,要启动多线程就好了,先要新建一个线程类。

import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class aThread extends Thread { 
   
    private Socket socket;
    public aThread(String s){ 
   
        super(s);
    }

    public aThread(Socket s){ 
   
        socket=s;
    }

    public void run(){ 
   
        try { 
   
            //BufferedReader bufReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedReader bufReader1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            //String time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date());
            String time = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
            while (true) { 
   
                String Line=bufReader1.readLine();
                if (Line.equals("over")) { 
   
                    break;
                }
                System.out.println("接收到了客戶端信息:" + Line);
//向客户端发送接收到的数据
                out.println("客戶,我在" + time+ "已經收到了你的信息: " + Line );
            }
        } catch (Exception e) { 
   
            e.printStackTrace();
        } finally { 
   
            System.out.println("關閉連接");
            try { 
   
                socket.close();
            } catch (IOException e) { 
   
                e.printStackTrace();
            }
        }
    }
}

然后是服务器的启动类。

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class server { 
   
    //public static int portNo = 3333;
    public static int portNob=14444;
    public static void main(String[] args) throws IOException { 
   
// TODO Auto-generated method stub
//初始化serverSocket类
        //ServerSocket s = new ServerSocket(portNo);
        ServerSocket s=new ServerSocket(portNob);
        System.out.println("啓動服務器");
//建立socket连接(阻塞,直到有客户端连接)
        //Socket socket = s.accept();
        int i=1;
        while (true){ 
   
            System.out.println("等待连接"+i++);
            Socket socket=s.accept();
            
            new aThread(socket).start();
        }
    }
}

好了,到这里,cs的基础模式和代码就写完了。那么,对于代码实现入门,你应该明白了吧?其实,通常情况下,客户端自己也有很强的业务逻辑处理能力,一些不用发请求就可以解决的问题,本地就搞定了,只有一些要同步到网络的操作,才会特意联网传送的,比如:账号验证,下载数据,或者一些要同步数据库的操作。
那么,说完了cs模式之后,我们要讲接下来的另一种网络通信模型:p2p。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193291.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iozone使用简介

    iozone使用简介iozone 使用简介 iozone www iozone org 是一个文件系统的 benchmark 工具 可以测试不同的操作系统中文件系统的读写性能 可以测试 Read write re read re write readbackward readstrided fread fwrite randomread pread mmap aio read aio write 等等不同的模式下的硬盘的性能 命令详情 aAutomode AAuto2mode b

    2025年9月1日
    2
  • classcastingexception_c++链接错误

    classcastingexception_c++链接错误转载自:http://www.blogjava.net/Sunday/archive/2007/08/18/137860.html现在java编程中经常碰到ClassCastException错误,ClassCastException是JVM在检测到两个类型间的转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。本模式试图为您提供了解和排除ClassCastExcept

    2025年10月15日
    4
  • vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)「建议收藏」

    vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)「建议收藏」刚开始地图怎么也出不来,经过解决,是因为echarts.min.js引入位置在index.html中引入需要的js版本按照自己需要的来<scriptsrc=”./static/plugins/echarts-5.1.2/echarts.common.min.js”></script><scriptsrc=”./static/plugins/echarts.min.js”></script>(必须引入,地图才能加载)全局引入im

    2022年10月12日
    2
  • Python之numpy库

    NumPy库知识结构

    2021年12月19日
    40
  • moxa串口服务器的配置(波特率如何设置)

    MOXA串口服务器产品配置说明附图.doc第一章:准备工作准备工作我们用一条交叉网线把NPort5110和PC机的网口连接起来,并把NPort上电。首先,打开控制面板,网络连接。在本地连接上点右键,选择属性。双击进入Internet协议(TCP/IP),点击“使用下面的IP地址”写入IP地址和子网掩码,记住要和NPORT的IP地址在同一子网段内。如NPORT默认IP为192.168…

    2022年4月9日
    119
  • mysql分区表详解_详解MySQL分区表「建议收藏」

    mysql分区表详解_详解MySQL分区表「建议收藏」前言:分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。1.分区的目的及分区类型MySQL在创建表的时候可以通过使用PARTITIONBY子句定…

    2022年4月30日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号