计算机,顾名思义便是用来作计算。于是也须要输入和输出,输入须要计算的条件,输出计算结果。这些输入输出能够抽象为I/O(input output)。python
Unix的计算机处理IO是经过文件的抽象。计算机不一样的进程之间也有输入输出,也就是通讯。所以这这个通讯也是经过文件的抽象文件描述符来进行。服务器
在同一台计算机,进程之间能够这样通讯,若是是不一样的计算机呢?网络上不一样的计算机,也能够通讯,那么就得使用网络套接字(socket)。socket就是在不一样计算机之间进行通讯的一个抽象。他工做于TCP/IP协议中应用层和传输层之间的一个抽象。以下图:网络
socket保证了不一样计算机之间的通讯,也就是网络通讯。对于网站,通讯模型是客户端服务器之间的通讯。两个端都创建一个socket对象,而后经过socket对象对数据进行传输。一般服务器处于一个无线循环,等待客户端链接:并发
socket接口是操做系统提供的,调用操做系统的接口。固然高级语言通常也封装了好用的函数接口,下面用python代码写一个简单的socket服务端例子:socket
server.pytcp
import socket HOST = 'localhost' # 服务器主机地址 PORT = 5000 # 服务器监听端口 BUFFER_SIZE = 2048 # 读取数据大小 # 建立一个套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定主机和端口 sock.bind((HOST, PORT)) # 开启socket监听 sock.listen(5) print 'Server start, listening {}'.format(PORT) while True: # 创建链接,链接为创建的时候阻塞 conn, addr = sock.accept() while True: # 读取数据,数据还没到来阻塞 data = conn.recv(BUFFER_SIZE) if len(data): print 'Server Recv Data: {}'.format(data) conn.send(data) print 'Server Send Data: {}'.format(data) else: print 'Server Recv Over' break conn.close() sock.close()
client.py函数
import socket HOST = 'localhost' PORT = 5000 BUFFER_SIZE = 1024 # 建立客户端套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 链接到服务器 sock.connect((HOST, PORT)) try: message = "Hello" # 发起数据给服务器 sock.sendall(message) amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: # 接收服务器返回的数据 data = sock.recv(10) amount_received += len(data) print 'Client Received: {}'.format(data) except socket.errno, e: print 'Socket error: {}'.format(e) except Exception, e: print 'Other exception: %s'.format(e) finally: print 'Closing connection to the server' sock.close()
python代码写套接字很简单。传说的TCP三次握手又是如何体现的呢?什么是三次握手呢?网站
用下面的比喻就是spa
C:约么?操作系统
S:约
C:好的
约会
这样就创建了一个TCP链接会话。若是是要断开链接,大体过程是:
上图也很清晰的代表了三次握手的socket具体过程。
至此,客户端和服务器的socket通讯链接创建完成,剩下的就是两个端的链接对象收发数据,从而完成网络通讯。