网络编程之socket新解
由于工作并不是很忙,闲暇之余就读了下tomcat的源代码。我是从事java服务器开发工作的,大体的一些服务器线程模型我都是了解的。其大部分都是由一个线程调用监听端口等待客户端的链接,建立连接后再交由其他的线程负责具体的网络io操作。可tomcat居然是用多个线程调用同一个ServerSocket实例的accept方法。我读过mina也读过netty的源码,自己在大学时也写过不少的基于socket通信的程序,但是这种用法自己从未想过也从未见过。(恕本人咕噜寡闻了,-_-|||)不免好奇,这么做原来没问题啊?可这么做能有什么好处吗?
要明白这么做的道理,恐怖不得不去搞清楚套接字的accept方法底层到底干了什么,与TCP的三步握手又是什么关系。我查了一些资料大体把这些搞明白了,在这里记录下来以加强自己的认识,也同时共享给哪些跟我一样对socket的认识有所偏差的人。
一、首先说一下TCP三步握手的基本流程,如下图:

注意说到的两个队列:半连接队列和完全连接队列
二、socket操作和TCP的关系
也许好多人都是认为,当我们调用ServerSocket的accept方法时,是在监听等待客户端的连接,当客户端请求服务器时就创立连接并返回与客户端通信的socket。实际呢却不是这样子的。我们来看一个现象
首先我们启动一个服务器程序,程序很简单:代码如下
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket sSocket = new ServerSocket(3661, 2);//第二个参数的含义后边会讲解
System.in.read();//防止程序退出
}
}
可以看到,这里我们并没有调用serversocket的accept方法。如果按上边说的,accept方法是监听端口等待客户单的连接并完成连接的建立的话。我们这个服务器程序根本无法监听端口并完成连接建立。接下来验证一下,
首先运行服务程序程序,然后我们在命令行下用netstat -an查看一下端口情况:

可以看出端口依然被监听了,并处于tcp三步握手的LISTEN状态。接下来我们连接试试能不能进行连接,启动一个命令行窗口,执行:
telnet 127.0.0.1 3661。不要把这个关啦,再启动一个命令行窗口执行以下上边的netstat -an命令:

可以看到,连接已成功建立了,TCP已经进入ESTABLISHED阶段。看以看到,我们不调用accept方法一样可以监听端口并和客户端建立连接。
由此我们可以证明accept方法并不是监听端口等待客户端的连接并建立连接。那是什么起到了监听端口等待客户单连接的作用的,通过看源码我们会发现构造方法调用了bind方法。
看到这里想必都能知道,其实在我们调用accept返回一个socket时,tcp早已把三步握手的过程完成了,连接已经都建立好了。那我们的accept具体干什么事呢?还记得上边提到的完全连接队列吧。accept就是从完全连接队列取出连接并封装成socket。ServerSocket的构造方法参数backlog就是指定这个队列的大小。比如上边服务器程序我们制定了backlog的值为2,当我们用三个命令行分别调用telnet 127.0.0.1 3661时,我们会发现第三个连接请求将是无法连接。
网络编程之socket新解的更多相关文章
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- 网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- 网络编程之Socket代码实例
网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- Python网络编程之socket应用
1 引言 本篇主要对Python下网络编程中用到的socket模块进行初步总结.首先从网络基础理论出发,介绍了TCP协议和UDP协议:然后总结了socket中的常用函数:最后通过实际代码展示基本函数的 ...
- 【python之路35】网络编程之socket相关
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
随机推荐
- 微信公共平台开发-(.net实现)5--access_token过期的问题
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...
- 推荐几款自己写博客使用的Ubuntu软件
使用Ubuntu桌面有段时间,到现在也写过几篇博客了,期间用到的几款好用的软件推荐给大家.1. 图片简单编辑软件gthumbubuntu默认提供shotwell查看图片,类似与windows的图片查看 ...
- Java IO3:字节流
流类 Java的流式输入/输出是建立在四个抽象类的基础上的:InputStream.OutputStream.Reader.Writer.它们用来创建具体的流式子类.尽管程序通过具体子类执行输入/输出 ...
- python的高性能web应用的开发与测试实验
python的高性能web应用的开发与测试实验 tornado“同步和异步”网络IO模型实验 引言 python语言一直以开发效率高著称,被广泛地应用于自动化领域: 测试自动化 运维自动化 构建发布自 ...
- Github教程(0)
Git下载:https://git-for-windows.github.io/ 我下载的版本是:Git-2.6.3-64-bit.exe 安装:略 默认选项点击"下一步"即可 安 ...
- Nim教程【十一】
引用类型和指针类型 不同的引用可以只想和修改相同的内存单元 在nim中有两种引用方式,一种是追踪引用,另一种是非追踪引用 非追踪引用也就是指针,指向手动在内存中分配的对象: 追踪引用指向一个垃圾收集的 ...
- Comet实现的网页聊天程序
“上一篇”介绍了我在c/s程序中用了那些技术,如今只谈c/s不谈b/s那未免out了,势必要写一写b/s的程序与大家共勉. 回忆做技术这些年,06年每天盯着“天轰穿”的视频不亦乐乎,估计那是一代程序员 ...
- JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...
- linux service
有些东西真是难得搞懂,一旦懂了就容易记住了. 说到service 就不能不说 daemon, 他们两者看起来不相关.其实是紧密相连的两个概念. —— 就像两个同心的正五边形和正六边形放在一起时候的样子 ...
- MyBatis入门学习(三)
在实际开发中,我们希望文件配置是分类配置存放,需要的时候引入即可.如果多文件的配置混合配置使用,那么对项目的后期维护将增加难度. 一.对于连接数据库的配置单独放在一个properties文件中 1.对 ...