英 ['sɒkɪt] 美 ['sɑːkɪt]
- n. 插座;插口;窝;穴孔;套接口,套接字
- vt. 装上或插入插座
new
socket的英文翻译是什么意思,词典释义与在线翻译:
详尽释义
n. (名词)
- 槽,臼,窝
- 孔,洞,凹处
- 眼窝
- 托座,承口
- 【电】插座,插口,管座
- 【解】窝,腔
- 【地】牙槽
- 烛窝
- 轴孔
- 【机】承窝
- 座
v. (动词)
- 给…配插座
- 将…装入插座,使装入插座
- 用插座固定住
- 用球棒的后跟击(高尔夫球)
- 插,套
- 把...装入承窝
- 插进插座
- 套接口
双解释义
n. (名词)
- [C] 孔,穴;插孔;插座 hollow in which sth fits or turns
英英释义
Noun:
- a bony hollow into which a structure fits
- receptacle where something (a pipe or probe or end of a bone) is inserted
- a receptacle into which an electric device can be inserted
socket的用法和样例:
例句
用作名词 (n.)
- There is an electric socket in the wall.
墙上有个电源插座。 - This type of bulb screws into the socket.
这种灯是拧到灯座上的。 - Never poke a finger or scissors into an electric socket.
千万不要把手指或剪刀插进电源插座。 - The little droid's datajack rotated in the wall socket.
小机器人的数据读取臂在墙上的一个凹嵌插口中旋转了一下。 - Connect the release switch to the remote control
socket of the camera.
把释放开关接到相机遥控插口。 - She fear her eyes may actually pop out of their socket.
她害怕她的眼睛会真的从眼窝里瞪出来。
用作及物动词 (vt.)
- To protect the device, you need to socket the power plug before turning it on.
为保护这个设备,在打开开关前,你得把电源插头插到插座里。
常见句型
用作名词 (n.)
- He put the electric plug into the socket.
他把电插头插入插座。
词汇搭配
- eye socket 眼眶
- drill socket 长钻套,长钻头套筒,...
- socket bend 管节弯头
- dry socket 干槽症
- cushion socket 减震座,防震插座,弹...
- plug socket 塞孔
- socket joint 套筒接合,套接,承插...
- wall socket 壁上插座
- ball socket 球套,球形支座...
- reducing socket 缩径承窝
- pipe socket 喇叭口
- socket spanner 套筒扳手
- bayonet socket 卡口插座,卡口灯座...
- socket switch 插座式开关,灯头开关...
- bell socket 套接,钟形打捞工具,...
- screw socket 螺丝口(螺口插座)...
- pull socket 插头,抽拉插座...
- socket adapter 插座转接器
- keyless socket 无键插座
- key socket 电键插座
以上内容独家创作,受著作权保护,侵权必究
作为一个渣渣,我是真滴难以理解Socket和套接字,最后我决定调整一下文章论述顺序,先将哪里用到了套接字和Socket吧
1.哪里用到了套接字和Socket?
先来一段http原理的总结:
http的实现原理其实就是数据在传输过程中的,基于TCP/IP 的通信协议,主要分为四步:
① 连接:客户端与服务端建立连接,写入scoket虚拟文件后就表示建立连接
② 请求:通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成
③ 应答:Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
④ 断开连接:若connection
模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
(ps:这段话其实也是要理解的,对知识积累和面试都有好处的)
这段话里就提及了socket和套接字,也就是说在http请求中,就是使用了socket和套接字技术。
2.什么是socket?
socket是对TCP/IP协议的封装,它的出现只是使得程序员更方便地使用TCP/IP协议栈而已。socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)
如果大家学过Java中的项目,就知道写项目需要分为dao层(mapper层),service层(包括impl层),controller层,scoket就类似于这三层中的service层,起到逻辑处理和转发调用的作用(类似于租房子时的中介?)
3.什么是TCP套接字?
TCP的套接字就是IP号加端口号
其中,IP号是网络层用来寻找主机的;端口号是运输层用来找进程的,在网络层找到主机后就依据端口号找到相应进程,从而实现用户与服务器的通信。
要不我稍微通俗一点地解释一下,就像在谍战剧里面,党组织(客户端),间谍(服务端),客户端发送http请求就是党组织要与间谍交流情报(数据),TCP套接字类似于是对接暗号,socket是中间人(谍战剧里一般是个酒楼老板?哈哈)
如果get不到我这通俗解释的意思,大家可以忽略哈。
我是“道祖且长”,一个在互联网苟且偷生的Java程序员
题外话
前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人;但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有意思,动手写几个demo,但web socket需要特定的服务器支持,由于标准制定工作还没完成,所以没有多少主流的服务器支持,自己在网上下载了几个实现,包括php的、C#的、甚至Node.js的,但一个是协议变化比较大,很多代码已经过时了,再就是有一些支持最新的标准,但是我想稍微改造一下,看人家源代码的时候云里雾里,看看别人的代码行数也不多,决定自己实现一个。
悲剧由此开始,虽然哥们儿国内非知名工科大学毕业,但好歹也是科班CS出身,但大学得过且过,什么TCP/IP协议,什么socket了都没概念。为了做出一个简单的支持广播的websocket server,在网上找了很多相关代码,左抄一句,右抄一句,弄了一个星期竟然还是漏洞百出,调试不起来,只好从头来过了,先补一些基本知识,然后再一步步根据原理实现,今天终于实现了绝大部分功能,由此真的感受到了,搞计算机必须得有理论指导实践,否则只能像个没头苍蝇到处乱撞。
TCP/IP
要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,
从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的
估计有兴趣打开此文的同学都对此有一定了解了,加上我也是一知半解,所以就不详细解释,有兴趣同学可以上网上搜一下资料
维基百科
百度百科
在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作
socket
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket通信流程
socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手
socket编程API
前面提到socket是"打开—读/写—关闭"模式的实现,简单了解一下socket提供了哪些API供应用程序使用,还是以TCP协议为例,看看Unix下的socket API,其它语言都很类似(PHP甚至名字都几乎一样),这里我就简单解释一下方法作用和参数,具体使用有兴趣同学可以看看博客参考中的链接或者上网搜索
int socket(int domain, int type, int protocol);
根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。
domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址
type:socket类型,常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
把一个地址族中的特定地址赋给socket
sockfd:socket描述字,也就是socket引用
addr:要绑定给sockfd的协议地址
addrlen:地址的长度
通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
int listen(int sockfd, int backlog);
监听socket
sockfd:要监听的socket描述字
backlog:相应socket可以排队的最大连接个数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
连接某个socket
sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:socket地址的长度
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
TCP服务器监听到客户端请求之后,调用accept()函数取接收请求
sockfd:服务器的socket描述字
addr:客户端的socket地址
addrlen:socket地址的长度
ssize_t read(int fd, void *buf, size_t count);
读取socket内容
fd:socket描述字
buf:缓冲区
count:缓冲区长度
ssize_t write(int fd, const void *buf, size_t count);
向socket写入内容,其实就是发送内容
fd:socket描述字
buf:缓冲区
count:缓冲区长度
socket标记为以关闭 ,使相应socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。
参考
Linux Socket编程(不限Linux)
揭开Socket编程的面纱
PS. 有同学看完后发现没有demo示例,参考中的示例已经很不错了,我就不班门弄斧了,而且我用C#实现了一个websocket server,接下来的博客中会有介绍。另外由于刚刚实际接触socket,文中谬误较多,还望大家批评指正,文章内容主要参考上面两个博文,图片全部来源于网络,在百度图片搜索得来,无法注明第一源地址,如有版权问题请站内信联系,第一时间处理。