一:socket基础:
1.1:Socket基础:
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
file模块是针对某个指定文件进行 "打开"<——>"读写"<——>"关闭"
socket模块是针对 服务器端 和 客户端Socket 进行<——>"打开"<——>"读写<——>"关闭"即是夸主机继续通信的一种方法
Socket的英文原义是“孔”或“插座”,在操作系统上被称作"套接字",用于描述IP地址和端口,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务,连接是如何建立的呢?
1.2:以下是非常经典的 三次握手:
1.3:有连接就有断开,下图是经过四个过程的端口步骤:
1.4:socket在web的应用:
import socket def main1(): #创建socket对象 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind(("localhost",8080)) #监听端口 sock.listen(5) #最大连接数 while True: #阻塞,直到有请求连接,有请求过来才会继续执行 #connrction代表客户端的socket对象,是和客户端通信的连接线 #assress是客户端的IP地址 print("1111111111") #阻塞之前打印的信息 connrction,address = sock.accept() #客户的的socket和地址 buf = connrction.recv(1024) #收到的客户端的信息 print(connrction,"connrction") #打印客户端的socket print(address,"address") #打印客户的的ip print(buf,"buf") #打印客户的发送的信息,即打印服务器收到的信息 connrction.send(b"HTTP/1.1 200 OK\r\n\r\n") #发给客户端额版本信息 connrction.send(b"Hello WORD") #connrction.close() #关闭连接 if __name__ == "__main__": main1() 执行结果: 1111111111 <socket.socket fd=292, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 4848)> connrction ('127.0.0.1', 4848) address b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-US,en;q=0.8,zh;q=0.6,zh-CN;q=0.4\r\nCookie: csrftoken=SJMnWsucXeD3EMra5EGg26PZBVzTOCil\r\n\r\n' buf 1111111111 <socket.socket fd=296, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 4849)> connrction ('127.0.0.1', 4849) address