热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

开始之前,先大概说一下吧。计算机网络研究的是理论,讲究的是网络过程中的连接方式,还有协议制定的原因,为什么这么指定ÿ

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


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


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有