从事业务开发太久,突然被问到Socket是什么这个问题?竟然一下子系统回答不上来,咳,可怕。

1.Socket是什么

了解Socket首先必须要对基础网络传输协议有一定的了解,比如OSI七层和TCP/IP五层标准网络架构有一定的了解。

TCP/IP五层:应用层,传输层,网络层,数据链路层,物理层;
OSI七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层;
其中除了,表示层和会话层外,每一层都有自己的协议,也就是数据格式。
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet。
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP。
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2。这里给出一个问题,为什么一会七层,一会又五层,两者关系是啥?

上面只是网络传输架构,以及具体的协议格式,那么具体实现尼?
来了,Socket是对TCP/IP是对整个网络传输协议架构的封装,它的出现只是使得我们更加方便的使用TCP/IP协议栈而已。它提供了针对传输层TCP或者UDP编程的接口。

2.Socket例子

2.1 一个TCP连接
一个TCP连接由客户端Ip+端口号,服务端Ip+端口号确认!任何端不能创建一个相同的TCP连接!!否则,出错,Address already in use!

2.2 服务端-- 连接监听端

package socket;import java.io.*;
import java.net.*;public class TcpServer {public static void main(String[] args) throws Exception {//ServerSocket源码解析,指定了监听的端口号。ServerSocket server = new ServerSocket(9091);try {Socket client = server.accept();try {BufferedReader input =new BufferedReader(new InputStreamReader(client.getInputStream()));boolean flag = true;int count = 1;while (flag) {System.out.println("客户端要开始发骚了,这是第" + count + "次!");count++;String line = input.readLine();System.out.println("客户端说:" + line);if (line.equals("exit")) {flag = false;System.out.println("客户端不想玩了!");} else {System.out.println("客户端说: " + line);}}} finally {client.close();}} finally {server.close();}}
}

从程序中可以看到,服务端使用ServerSocket监听一个端口号,客户端通过这个端口号和服务端建立连接。
当然,服务端默认使用本机ip,也可以指定一个IP(因为服务端可能存在多网卡,多ip)。


InetAddress bindip = InetAddress.getByName("192.168.1.168");
ServerSocket server = new ServerSocket(9091, 0, bindip);

2.3 客户端 – 连接发起端

package socket;import java.io.*;
import java.net.*;
import java.util.Scanner;public class TcpClient {public static void main(String[] args) throws Exception {Socket client = new Socket("127.0.0.1", 9091);try {PrintWriter output =new PrintWriter(client.getOutputStream(), true);Scanner cin = new Scanner(System.in);String words;while (cin.hasNext()) {words = cin.nextLine();output.println(words);System.out.println("写出了数据: " + words);}cin.close();} finally {client.close();}}
}

但上面程序可以看到,客户端建立连接通信时候,需要指定服务端的IP和端口号。
但是客户端并未指定自己这端的端口号以及IP,注意,Socket客户端在和服务端连接时,会随机分配一个端口号以及使用本机IP。

3.Socket应用

Socket是一个最基本的一个TCP传输层协议的接口。
上面示例只是最简单一个Socket通信例子,要达到生产级别的应用,还远不止如此!

3.1 Dubbo中的应用

Dubbo是基于TCP协议的,底层的通信原理肯定也会使用Socket,只不过通过TCP协议传输的内容有自己格式规约(Dubbo自己的协议)。
当然,并不是指Dubbo改造TCP协议,而是Dubbo在TCP协议报文里传输的内容指定了一个固定格式。

一次Dubbo调用?
Consumer调用Provider的接口
1.通过注册中心Register随机找到一个Provider所在的机器IP+端口号。

IP+端口号是在Provider上报到Register注册中心的,上报的数据格式可能是Map,key是接口,value是当前机器的Ip+port。

2.按Dubbo协议组装传输的内容格式,其中包含了调用的具体接口名、方法名、参数序列化后的二进制内容。
3.通过Socket和Provider的机器建立连接,并传输Dubbo协议内容。
4.Provider监听本机上的对应IP+端口号,获取传入的内容。解析获得Provider调用的接口名、方法名、同样的序列化方式反序列化得到入参。
5.通过Java反射运行Provider上指定的方法,得到结果后,同样反序列化给Consumer端。
以上是远程调用的一个本质原理,其中涉及到序列化,反射,甚至要考虑多线程。Dubbo作为一个高可用,高扩展的RPC框架,其中内容远不止如此简单。

3.2 XxlJob上的应用
XxlJob是一个分布式任务调度平台。它包含了定时任务控制台、客户端。
控制台是对客户端具体定时任务的调度。
客户端是对具体定时任务的执行。

这里就不说具体怎么使用了。只问一个问题,客户端是在其他机器上部署的,控制台是怎样找到客户端并执行具体定时任务的?
客户端简单实现

@Slf4j
@Component
@JobHandler(value = "subscribeTagTask")
public class SubscribeSelectTask extends IJobHandler {private final AManager aManager;private final SManager sManager;@Overridepublic ReturnT<String> execute(String s) throws Exception {return ReturnT.SUCCESS;}public SubscribeSelectTask(AManager aManager,SManager sManager) {this.aManager = aManager;this.sManager = sManager;}
}

这里简单说下:
1.客户端启动的时候,会对配有JobHandler注解的定时任务进行扫描,并上报当前定时任务运行的机器的IP+Port到控制台。
同时对该IP+Port进行监听,等待控制台调度消息。
2.控制台将上报内容存储到已经配好的这个任务。
3.控制台在达到调度时间的进行调度时候,会从多个客户端里面随机或者轮询(可配置)选择一个客户端IP+Port,建立TCP连接。
并传输调度指令。
4.客户端监听到这个消息后,解析控制台发的调度指令,找到对应的定时任务,怎么找到尼,或许是按照JobHandler配置的Value
通过反射找到指定的定时任务,并通过反射执行。
TIPS:上面XXLJOB的客户端其实也是Socket对应的服务端,会进行Socket连接监听。
以上就是大致的原理,具体细节要深入源码,如有不对,敬请指正。

参考文章
https://blog.csdn.net/github_34606293/article/details/78230456
https://blog.csdn.net/wzy_1988/article/details/17131381

Socket究竟是干什么的?相关推荐

  1. 电路中的0欧姆电阻究竟是干什么用的?

    写在前面 本文摘自知乎问题0欧电阻为什么能把数字模拟混合电路中的地分开?部分大佬的回答,使用之前没有经过各位大佬的同意,如有侵权,请联系博主E-Mail删除,谢谢. @运算放大器的回答 以下为原文:@ ...

  2. Android Launcher研究(二)-----------Launcher为何物,究竟是干什么的?

    Launcher俗称HomeScreen,也就是我们启动Android手机,第一眼看到的应用程序,而这个应用程序是比较特殊而且任务艰巨的. 它负责了我们除了应用本身操作以外的所有操作,它负责了我们有几 ...

  3. 电路中的0欧姆电阻究竟是干什么用的?——0欧姆电阻的一些用法解释

    文章目录 写在前面 @运算放大器的回答 @小文文的回答 @魔子的回答 写在最后 写在前面 本文摘自知乎问题0欧电阻为什么能把数字模拟混合电路中的地分开?部分大佬的回答,使用之前没有经过各位大佬的同意, ...

  4. MySQL中的pid与socket是什么?

    前言: 不知道你有没有注意过,MySQL 启动时需要配置 pid 及 socket 文件路径.偶尔还会出现因 pid 文件找不到而启动失败的现象,那么 pid 与 socket 文件究竟是干什么用的呢 ...

  5. python概念-Socket到底有多骚

    Socket究竟是什么呢? 简单来说Socket就是用来完成客户端与服务器之间的通信 例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序 Socket是基于互联网OSI七层协 ...

  6. 什么是政微助手?政微助手是干什么用的?

    什么是政微助手?政微助手是一个通过依托微信生态,利用低代码,微服务的形式,为国内三四线基层政务部门打造的一个移动端减负增效工具,该工具通过打通个人微信.企业微信.微信小程序三端的数据壁垒,通过高效的S ...

  7. 产品经理究竟是干嘛的

    产品经理究竟是干嘛的? 简单来说,产品经理主要的工作就是:规划.设计产品,对产品研发过程的控制,最终把产品卖出去的一个过程. 而产品经理,基于服务的对象不同,主要分为两种:to b (针对企业)和to ...

  8. 学好了Python可以干什么?

    随着我国对编程的重视程度上升,Python编程的学习趋势逐渐低龄化.在全国掀起Python编程热的同时,还是有许多人对于学习Python抱有怀疑,那么我们就来看看学好了Python究竟可以干什么.根据 ...

  9. 云队友丨一战打败马云,四十岁的黄峥究竟有多恐怖?

    作者:何加盐 来源:公众号"何加盐" ID:ihejiayan 黄峥/图源:colinhuang.com 黄峥可能没有想到,40岁这年,他会以这样的面貌出现在媒体上. 年中,由于拼 ...

最新文章

  1. Javascript+xmlhttp调用Webservice
  2. 清单革命:为什么不仅是工具革命?
  3. 求只有2,3,5组成的第n小个数字
  4. 高可用高性能分布式文件系统FastDFS实践Java程序
  5. java 铺地板问题_铺木地板的5大注意事项,我家接连踩坑接近“崩溃”,大家别再犯...
  6. 用户遭骚扰质疑隐私被航旅纵横泄露 回应:用户有开启关闭的自主权
  7. mongodb-查询
  8. 贾君鹏你妈妈喊你回家吃饭-利用WCF的Duplex推送消息
  9. HenCoder Android 自定义 View 1-8 硬件加速
  10. 2018华为数通技术大赛复赛拓扑具体配置
  11. 百度富文本编辑器UEditor增加自定义字体
  12. 如何把证件照裁剪到需要的尺寸?小一寸证件照的尺寸是多少?
  13. iphone5刷android,iphone5s怎么刷机 简单几招搞定iOS【图文教程】
  14. 计算机二级15年大纲,2015年下半年全国计算机二级考试MSoffice高级应用大纲
  15. python是个啥-CPython是个什么鬼?
  16. SpringBean篇 (2) 注解配置形式
  17. Postman使用newman命令执行
  18. 硬件学习(一)电容作用
  19. java 搜索 下拉列表框_用java编写随用户输入自动弹出下拉列表匹配项目,类似百度搜索...
  20. 我不太肯定我的方向,但是我希望自己能走的远一点。

热门文章

  1. 程序员必备的6款工具软件,炒鸡实用!
  2. Markdown公式(二)
  3. 抽奖程序(python)
  4. 微信公众平台测试号申请
  5. 【python】gensim corpora的简单使用
  6. 计算机应用投稿建议,计算机类核心期刊投稿心得【转】 - 计算机软件及计算机应用 - 电子技术及信息科学 - C......
  7. 霖呆呆的近期面试128题汇总(含超详细答案)
  8. Android GLSurfaceView详解
  9. 海康威视接口调用报错处理
  10. Elasticsearch 响应数据压缩功能详解