Socket源码当场分析

在这里插入图片描述
先来看看他引入了什么包,前两个包是io流的,可以简单的搭建起一个BIO模型,由于之前写的那篇博文略水,所以细说一下:BIO是一个最简单的传输模型,全称为Blocking IO他是同步切阻塞的。就如同学校差一点的食堂菜口,做饭的叔叔阿姨如果没把饭做好,那你只能默默等待,直到“佳肴“”出炉,你才能蹦跳着离开。关于这个包的解析我尽量快点推出。
第四个SOCKETCHANNEL是一个优于前两者的双向通道
欢迎大佬们在评论区中说出后面几个的用途并一起交流交流。

正式开始

在这里插入图片描述
我们看到这个类的开头定义,得知Socket继承于Closeable这个类,并规定了许多属性。本着Java万物基于Object的思想,我决定先看看Closeable 这个类有啥内容
在这里插入图片描述
显然他是个控制Socket关闭的类,其实还能往下看,但是猜测一下就知道他的父类是干什么了。有兴趣的朋友可以自己看看,他的最底层是个自定义接口。
回到Socket,在他的属性中有一个我从未见过的类
在这里插入图片描述
我先忽略继续Socket,在其构造函数中定义了调用了一个方法在这里插入图片描述
创建了一个未连接的socket还规定了他是一个system-default类型的socketimpl。我们来看看 他其中调用的方法
在这里插入图片描述
这个方法中的factory定义如下
在这里插入图片描述
注释上说这是个工厂,有点抽象。不妨进一步挖掘其源码SocketImplFactory定义如下在这里插入图片描述
到这里还是出现了SocketImpl。

什么是SocketImpl?这个问题先记到小本本上,在末尾我们在一起探讨。

回到Socket看他其他的构造函数
在这里插入图片描述
在这里插入图片描述
这就到了我们最常用的一个构造函数了注释上说他是用于创建并连接,注释上还说该构造函数会在连接前判断host是否为空,若为空则会创建"plain"socket。在后面几个构造函数中都可以发现这个InetSocketAddress,说明这个方法负责Socket的连接,感兴趣可以去看看他的源码。

写到这我已经有些乏力了,主要是英文看起来好累

为了不让内容变水,我决定最后分析一个常用方法的源码
在这里插入图片描述在这里插入图片描述
首先他对一系列先决条件做判断,然后锁定当前Socket,那一大串我们可以暂时不管,主要看他的return在这里插入图片描述
得出他返回的就是当前的InputStream

最后

https://www.cnblogs.com/havener/archive/2013/03/09/2951915.html
这篇博客很好的解决得SocketImpl是什么的问题

码字真的不容易,看原文太耗精力了,希望下次还有机会再这样分析分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于 socket 是一个在操作系统中实现的 API,因此源码实现会因不同的操作系统而异。以下是 Linux 操作系统上的 socket 源码实现(基于 C 语言): ```c #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> #include <string.h> #define PORT 8080 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); return -1; } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt failed"); return -1; } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); return -1; } if (listen(server_fd, 3) < 0) { perror("listen failed"); return -1; } if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept failed"); return -1; } valread = read(new_socket, buffer, 1024); printf("%s\n", buffer); send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); return 0; } ``` 这个程序创建了一个服务器,监听端口 8080,并在有客户端连接时发送 "Hello from server" 消息。该程序使用了 socket、setsockopt、bind、listen、accept、read 和 send 等操作系统提供的 API 来实现服务器的功能。 当然,这只是一个简单的例子,实际开发中可能需要更加复杂的代码来实现各种功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值