咱们知道两个进程若是须要进行通信最基本的一个前提可以惟一的标识一个进程,在本地进程通信中咱们可使用PID来惟一标识一个进程,但PID只在本地惟一,网络中的两个进程PID冲突概率很大,这时候咱们须要另辟它径了,咱们知道IP层的ip地址能够惟一标识主机,而TCP层协议和端口号能够惟一标识主机的一个进程,这样咱们能够利用ip地址+协议+端口号惟一标识网络中的一个进程。html
可以惟一标示网络中的进程后,它们就能够利用socket进行通讯了,什么是socket呢?咱们常常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操做抽象为几个简单的接口供应用层调用以实现进程在网络中通讯。python
说了这么多,是否是没听懂,不要紧,咱们直接上代码:web
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\r\n\r\n") 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,浏览器做为客户端与之进行交互!app
咱们来看看socket server 、client 底层是如何实现的:框架
socket_server.pysocket
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_client.pytcp
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()
持续更新中....