目录

  • 20175323 团队项目服务器端函数功能与业务逻辑详解
  • Socket在服务器和客户端之间建立连接并进行数据交互的过程
    • 流程图(时序图)
    • UML类图
  • 编写代码实现socket收发消息的功能
    • 客户端程序
    • 服务器端程序
  • 程序运行结果
  • 实践收获
    • JAVA Socket和C Socket的比较
    • 客户端与服务器socket的比较
    • 实际生活中socket的使用与一部分思考

20175323 团队项目服务器端函数功能与业务逻辑详解

本博客对于团队项目的服务器端程序的函数功能做出了解释,并对于整个应用系统的服务器端的业务逻辑做出了解释


Socket在服务器和客户端之间建立连接并进行数据交互的过程

流程图(时序图)


预想的每一步的操作过程都已经体现在流程图中了

UML类图

所以总计需要四个类:客户端、服务器、发送、接收,客户端和服务器分别对发送和接收都有依赖关系
UML类图如下

编写代码实现socket收发消息的功能

客户端程序

package com.wenqier.client;import java.net.*;
import java.io.*;//聊天过程用于发送信息的线程
class Send extends Thread {Socket socket;public Send(Socket sock) {this.socket = sock;}// 专门用于发送信息public void run() {DataOutputStream out;while (true) {BufferedReader input = new BufferedReader(new InputStreamReader(System.in));try {String str;str = input.readLine();out = new DataOutputStream(socket.getOutputStream());out.writeUTF(str);} catch (Exception e) {}}}
}// 创建一个专门用于接收消息的线程
class Receive extends Thread {Socket socket;public Receive(Socket sock) {this.socket = sock;}public void run() {// 专门用于接收消息DataInputStream in;while (true) {try {in = new DataInputStream(socket.getInputStream());String str = in.readUTF();System.out.println(str);} catch (Exception e) {}}}
}public class Client {static Socket socket;public static void main(String[] args) throws Exception {socket = new Socket("127.0.0.1", 5678);System.out.println("客户端.....");try {Send send = new Send(socket);Receive receive = new Receive(socket);// 打开线程send.start();receive.start();} catch (Exception e) {}}
}

服务器端程序

package com.wenqier.service;import java.net.*;
import java.io.*;//聊天过程中新建一个专门用于发送信息的线程
class Send extends Thread {Socket socket;public Send(Socket sock) {this.socket = sock;}// 专门用于发送信息public void run() {DataOutputStream out;while (true) {BufferedReader input = new BufferedReader(new InputStreamReader(System.in));try {String str;str = input.readLine();out = new DataOutputStream(socket.getOutputStream());out.writeUTF(str);} catch (Exception e) {}}}
}// 创建一个专门用于接收消息的线程
class Receive extends Thread {Socket socket;public Receive(Socket sock) {this.socket = sock;}public void run() {// 专门用于接收消息DataInputStream in;while (true) {try {in = new DataInputStream(socket.getInputStream());String str = in.readUTF();System.out.println(str);} catch (Exception e) {}}}
}public class Service {// 声明ServerSocket类对象static ServerSocket service;public static void main(String[] args) {try {service = new ServerSocket(5678);System.out.println("服务器端.....");Socket client = null;client = service.accept();Send send = new Send(client);Receive receive = new Receive(client);// 打开线程send.start();receive.start();} catch (Exception e) {}}
}

程序运行结果

运行程序在命令行里输出这个是客户端

客户端发送消息hello!

服务器端正常接收到了消息hello!,发回一个你好!

客户端正常接收到了发来的你好

实践收获

除了Java 的socket编程和多线程编程之外,通过查找资料我还有如下的收获

JAVA Socket和C Socket的比较

通过之前教材和本次实践学习的JAVA Socket与学长用例子给我讲socket的时候用的他编的C socket程序,我理解的两种socket的最主要不同有两个,就是面向对象与面向过程的不同和函数的封装的完备程度的不同。
我理解的面向对象与面向过程的不同最明显的就是C语言的socket程序,一般需要声明两个或者更多socket。这些套接字里必须要有一个socket调用accept方法监听客户端的连接请求,而accept方法返回的套接字描述符传给一个新的socket用来做数据交互,之前的socket继续监听。这样的机制能够保证服务器端一直有一个socket是监听状态。

而Java socket只要一个套接字就可以同时进行监听与数据传输,因为它可以调用Serversocket对象的获取输入以及输出流的成员函数来创建线程,用创建的线程实现数据交互,而这个主函数本身还可以继续监听客户端的请求。
另外一方面就是函数的封装,Java socket的库函数(确切的说是包)封装的非常完备,实现双方的数据交互全部的步骤也不到两三步。而C语言写socket就比这个要繁琐
C语言写socket要这样,地址和端口的绑定和监听都要自己写,而且函数参数貌似比Java复杂

用Java写tcp socket更加容易,目前更有助于我们理解计网学的tcp协议

客户端与服务器socket的比较

这个程序使用的是面向连接的socket,因此客户端和服务器都是socket但是有一些不同存在,就是服务器端要用accept方法接收客户端的连接请求

实际生活中socket的使用与一部分思考

实际生活中的应用系统,用的大多是面向无连接的socket,即使用的是udp协议的socket。比如说我们用的微信和QQ。因为,udp虽然无连接、不可靠、尽最大努力交付,但是和tcp相比它的速度非常优秀,可以满足聊天的实时性的需求,而且微信发语音要的也是个速度。
但是我们为了准确而且安全,使用了tcp协议的面向连接的socket,所以后期加上密码算法之后,聊天的用户体验就可能会受到网速(收发数据)、计算机硬件(加解密与验证的速度)的制约,但是我们的程序规模又不是特别大,效果上会影响的可能没有想象的那么大。

转载于:https://www.cnblogs.com/ruirui56/p/10964822.html

20175323 团队项目 服务器端函数功能与业务逻辑详解相关推荐

  1. ‘仿微信发表朋友圈’项目中登录功能的业务逻辑

    登录功能 手机号验证码都通过后端验证后 返回用户数据 登陆成功 成功后 调用store中的setUser方法 store中的setUser方法 将后端返回的用户信息存储到localStorage中 同 ...

  2. uni-app/Vue实现 购物车页面功能的业务逻辑

    uni-app/Vue实现 购物车页面功能的业务逻辑 用户在商品列表页或者商品详情页进行添加到购物车操作.把此商品需要在购物车渲染的数据整理好一个对象,转存到Vuex中 在购物车页面渲染列表数据 购物 ...

  3. ATS程序功能和使用方法详解

    转载自https://blog.zymlinux.net/index.php/archives/374 Apache Traffic Server的程序文件,与传统的服务器系统有大不同,这里我们将会对 ...

  4. 杂志订阅管理系统c++_电池管理系统BMS功能安全开发流程详解

    点击上面 "电动知家"可以订阅哦! BMS功能安全开发流程详解 BMS和ISO26262 - BMS & ISO26262简介 BMS即Battery Management ...

  5. php遍历视频文件,php使用glob函数遍历文件和目录详解

    php glob()函数返回匹配指定模式的文件名或目录.因此我们可以使用glob函数来查找文件,也可以实现目录的遍历. 函数说明:array glob ( string $pattern [, int ...

  6. 3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    十一休假,杭州西湖边逛了一圈只能用人山人海来形容,浙大紫金港校区也逛了一圈风景如画,建设得真不错很棒,假期就去了这2个地方,然后在家里陪老婆.看孩子.洗尿布.打了几局星际争霸,在网上接了一个B/S架构 ...

  7. 应用架构、业务架构、技术架构和业务流程图详解「建议收藏」

    应用架构.业务架构.技术架构和业务流程图详解「建议收藏」 应用架构(ApplicationArchitecture)是描述了IT系统功能和技术实现的内容.应用架构分为以下两个不同的层次:企业级的应用架 ...

  8. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  9. 站长在线Python精讲:在Python函数中的默认参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的默认参数详解>.本文的主要内容有:默认参数的概念和默认参数的示例.默认参数不能设置可变对象. 目录 1 ...

  10. 站长在线Python精讲:在Python中函数的定义与创建详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中函数的定义与创建详解>.本文的主要内容有:函数的定义.函数的定义规则.函数的创建. 目录 1.函数的定义 2 ...

最新文章

  1. 基于SSM实现公司内部培训系统的开发
  2. atitit.loading的设计与实现控件选型attilax 总结
  3. GOOD MEETINGS CREATE SHARED UNDERSTANDING, NOT BRDS!
  4. 一些非常有用的备忘录文档
  5. 在python中sqrt是什么意思_python中sqrt是什么意思
  6. Java设计模式—工厂方法模式抽象工厂模式
  7. 计算机系统-电路设计11-内存的内部电路实现(输入与输出同线)
  8. Hbase compact入门
  9. Flask项目之手机端租房网站的实战开发(十三)
  10. 【交通预测】基于matlab GUI交通预测四阶段法交通分配【含Matlab源码 1140期】
  11. ubuntu下人体姿态识别OpenPose编译运行
  12. 子查询定义从句总结(WITH AS 语句)
  13. JavaScript复习,this指向、原型链、变量提升、作用域、闭包
  14. python 内置函数_Python简介,第6章–内置函数和方法
  15. eSIM卡崛起:传统运营商地位岌岌可危
  16. echarts 世界地图 国家 中英文数据 nameMap
  17. 计算机高级属性启用玻璃,“win键+tab键无法使用”的解决方案
  18. java html pdf 中文_java html 转pdf 中文可显示
  19. 清除浮动的四种样式写法
  20. Gym-Retro:SpaceInvaders-Atari2600环境接口介绍

热门文章

  1. java中引用类型作形参_阿花宝宝 Java基础笔记 之 引用类型作为参数
  2. c++ 判断数学表达式有效性_2009年高考数学上海卷难度如何?独特的题型设计,让你耳目一新...
  3. iframe框架_性能优化去除iframe脚手架升级方案
  4. OpenCV之图像平滑处理
  5. 工程思想 ——【程序中的二进制】
  6. C语言:编写一个程序,从键盘读入一个矩形的两个边的值(整数),求矩形面积
  7. vim配置Nerdtree
  8. Windows核心编程_修改U盘图标
  9. c语言格式化浮点数多余的0
  10. 使用音频转换器怎么转换电影的格式?