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

什么是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。

计算机网络通信模型之cs模式(一)简单的socket相关推荐

  1. 策略模式与简单工厂模式区别(转)

    最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简 ...

  2. cs模式下,显示网络图片一例

    由于在cs模式中 显示图片很简单 picturebox1.image=image.fromfile(filename) 但是filename不能是url,所以不能显示网络图片,怎么办呢? 其实 .ne ...

  3. 大话设计模式-策略模式与简单工厂模式

    来源:http://blog.csdn.net/wulingmin21/article/details/6712684 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策 ...

  4. 什么是cs模式_CS的完整形式是什么?

    什么是cs模式 1)CS:公司秘书/计算机科学 (1) CS: Company Secretary / Computer Science) CS is an abbreviation of the C ...

  5. 应用软件类的推荐用CS模式

    2019独角兽企业重金招聘Python工程师标准>>> 首先给出论点:作为系统应用,BS任何方面都无法和多层CS模式相比. 下面,我们从若干方面来论证此论点的正确性: 多层CS模式安 ...

  6. java简单工厂模式_Java 简单工厂模式

    Java 简单工厂模式 2014-05-28·WeaponX 3717 次浏览 ## 介绍 简单工厂模式又称静态工厂模式. 简单工厂模式由工厂类角色.抽象产品角色和具体产品角色组成. 工厂类角色是本模 ...

  7. php fpm 三个模式_php-fpm运行原理和模式的简单介绍

    本篇文章给大家带来的内容是关于php-fpm运行原理和模式的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 运行原理: cgi初始化阶段:分别调用fcgi_init()和 s ...

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

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

  9. 设计模式—工厂模式之简单工厂模式

    1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂 ...

  10. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

最新文章

  1. 介绍一个效率爆表的数据采集框架
  2. 决策树算法详解(1)
  3. linux i2c 读写函数,Linux下读写芯片的I2C寄存器
  4. sdut 2087 离散事件模拟-银行管理
  5. python全栈开发总结_python全栈开发 * 12 知识点汇总 * 180530
  6. Building wheel for wrapt (setup.py) ... error的解决办法(图文)
  7. Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】
  8. fastjson反序列化漏洞_【安全风险通告】fastjson反序列化远程代码执行漏洞安全风险通告...
  9. hmcl手机版_hmcl启动器
  10. Web---HTTP请求、重定向、转发和数据压缩
  11. Opencv笔记(四)——绘图函数
  12. Julia : Formatting库的 fmt Base.@sprintf
  13. 超强实时跟踪系统首次开源!支持跨镜头、多类别、小目标跟踪!
  14. 狂神Mybatis入门
  15. This scheduler instance is still active but was recovered by another instanc解决办法
  16. 带宽下载速度单位换算
  17. javascript-原生javascript实现类似节奏大师小游戏
  18. 3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)
  19. 数字华容道java_从零开发HarmonyOS(鸿蒙)手机小游戏——数字华容道
  20. linux下截图软件,Flameshot - Linux下功能强大的屏幕截图软件

热门文章

  1. 毕业设计之甘特图制作
  2. USB、MiniUSB、MicroUSB
  3. Didn't find class ...l on path: DexPathList
  4. nginx获取第三方ngixn中请求头信息以及判断是否有参数的跳转地址
  5. 安装Ubuntu时:安装程序向硬盘复制文件时遇到错误
  6. 计算机安装win10系统还原,预装win10的ThinkPad笔记本电脑一键恢复出厂系统步骤
  7. 何时需要对时间序列进行Log Transformation
  8. 排列和组合问题完全解析
  9. android打开dialog黑色背景
  10. 17个好用免费的ftp软件工具推荐,支持中文