什么是Socket
Socket
又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
可以把Socket
理解成类似插座的东西, 通过Socket
就可以发送和接受数据了, 就像插座插上电器之后就可以向外提供电能了.
TCP
编程的客户端和服务器端都是通过Socket
来完成的.
其实UDP
协议通信也是使用的套接字, 和TCP
协议稍有差别. TCP
是面向连接的套接字, 而UDP
是面向无连接的套接字.
套接字的起源可以追溯到20世纪70年底, 他是加利福尼亚大学的伯克利版本 Unix(也成 BSD Unix) 的一部分. 因此, 有时你可能会听过将套接字称为伯克利套接字或 BSD 套接字.
套接字最初是为同一主机上的应用程序锁创建, 使得主机上一个程序(也叫一个进程)与另一个允许的程序进行通信. 这就是所谓的进程间通信(Inter Process Communication IPC)
Socket families
有两种类型的套接字: 基于文件的和基于网络的.
基于文件的套接字:AF_UNIX
AF_UNIX
是基于文件的套接字.
因为两个进程允许在同一台计算机上, 所以这些套接字都是基于文件的, 这意味着文件系统支持他们的底层基础结构. 这是能够说的通的, 因为文件系统是一个运行在同一主机上的多个进程之间的共享常量.
AF_UNIX
在编程的时候并不是太常用.
基于网络的套接字:AF_INET
AF_INET
用于基于网络的Socket
. 还有一个地址家族AF_INET6
, 用于IPv6
.
其实还有一些其他地址家族, 哪些要么是专业的, 过时的, 很少使用的, 要么是仍未实现的.
在所有的地址家族中, AF_INET
是使用最广泛的.
因为本章重点讨论网络编程, 所以本章剩余的内容中, 都是将使用AF_INET
socket
模块
要创建套接字, 必须使用socket
模块下的socket()
函数.
他的一般语法如下:
import socket
socket.socket(socket_family, socket_type, protocal=0)
说明:
其中,
socket_family
是AF_UNIX 或 AF_INET
,Socket_type
如果是TCP
编程是SOCKET_STREAM
, 如果是 UDP 编程则使用SOCKET_DGRAM
.protocal
通常省略, 默认是0
返回值就是
Socket
对象.Socket
对象提供了一些方法来让我们操作这些套接字.