socket
我们知道两个进程如果需要进行通讯最基本的一个前提能够唯一的标识一个进程,在本地进程通讯中我们可以使用PID来唯一标识一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标识主机,而TCP层协议和端口号可以唯一标识主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标识网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
说了这么多,是不是没听懂,没关系,我们直接上代码:
史上最牛B的框架祖宗
第一个socket代码:(模拟浏览器访问)
import socket
def main():
# 实例化socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#默认连接是tcp,ip 为ipv4,默认可以简写为: sock = socket.socket()
# 监听ip端口
sock.bind(('127.0.0.1',8080))
# 设置客户端最大连接数
sock.listen(5)
while True:
#循环时会等待客户端发来请求,直到有请求连接才执行下面的方法
print '.... waiting client connect ....'
connection, address = sock.accept()
#connection,address 分别代表客户端socket,客户端IP地址
#接受客户端发来的信息
client_data = connection.recv(1024)
print client_data
#注意:接受和发送的频率必须保持一次,否则阻塞
connection.send("HTTP/1.1 200 OK
")
connection.send('Hello, World')
#关闭服务端与client的连接
connection.close()
if __name__ == '__main__':
main()
服务端执行:
python socket_demo.py
执行结果:
.... waiting client connect ....
GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
RA-Ver: 3.0.7
RA-Sid:
.... waiting client connect ....
GET /favicon.ico HTTP/1.1
Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Accept: */*
Referer: http://localhost:8083/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
RA-Ver: 3.0.7
RA-Sid:
.... waiting client connect ....
客户端执行:(通过浏览器执行)
http://localhost:8080/
#执行结果:
Hello, World
是不是模拟了现实的https请求,socket server作为web,浏览器作为客户端与之进行交互!
我们来看看socket server 、client 底层是如何实现的:
socket server 与 client 交互 流程图
socket服务端:
socket_server.py
import socket
#实例化socket对象
sock_server = socket.socket()
#监听ip端口 (ip端口,元组形式传入)
sock_server.bind(('127.0.0.1',8082))
#最大连接数
sock_server.listen(5)
while True:
print "start waiting client connetcion ...."
connection,address = sock_server.accept() #accept 会阻塞
connection.send('服务端发送过来的数据')
client_data = sock_server.recv(1024)
print client_data
#服务端端口与客户端的连接
connection.close()
#这里端开的是与客户端的链接
注意:如果写成这样:sock_server.close() 这个是端口服务器,相当于down机
socket 客户端
socket_client.py
import socket
]#实例化socket对象
sock_client = socket.socket()
#连接服务端端 ,请注意:这里和服务端有点不一样,同时传入 ip端口,须是元组
sock_client.connect(('127.0.0.1',8082))
#发数据给服务端端
sock_client.send('send data from client')
#接受服务端发来的数据
server_data = sock_client.recv(1024) #当收发不相等时,recv 会阻塞
print server_data
#关闭与服务端的连接
sock_client.close()
持续更新中....