python socket初探
先看一段代码
import socket import sys import re def getServerContent(url): host_ip = socket.gethostbyname(url) with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s: s.connect((host_ip,80)) message = b"GET / HTTP/1.1\r\n\r\n" s.sendall(message) reply = s.recv(4096) return reply if __name__ == "__main__": if len(sys.argv) == 2: url = re.compile(r"www\.\S+\.[a-z]+") if url.match(sys.argv[1]): s = getServerContent(sys.argv[1]) print(s) else: print("Please enter the correct url") else: print("please specify the url")
这段代码的功能是连接上一个服务器,并发送http GET.比如连接上百度后会返回
HTTP/1.1 302 Moved Temporarily Date: Fri, 03 Feb 2017 09:55:35 GMT Content-Type: text/html Content-Length: 215 Connection: Keep-Alive Location: http://www.baidu.com/search/error.html Server: BWS/1.1 X-UA-Compatible: IE=Edge,chrome=1 BDPAGETYPE: 3 Set-Cookie: BDSVRTM=0; path=/
可以看出来,有了socket就可以进行网络间的通讯了。
什么是socket
在一台电脑上,一个进程和另外一个进程通信有很多种方法,比如:
- 信号量
- 全局变量
- 消息队列
在网络中,我们知道IP可以唯一的标识一台电脑。但是在同一时刻,电脑中可能有很多进程需要使用网络,比如我浏览器打开两个网页,可能就打开了两个网络通信进程。那么两台电脑的两个进程间怎么通信呢?于是就有了套接字(socket)。指定了IP和端口(端口和PID绑定),一个socket建立,网络中两个进程就可以通讯了。
socket是对传输层协议(主要是UDP和TCP)的一个封装,连接传输层和应用层。
python中的socket
python只是简单的对操作系统(类UNIX)socket函数进行了封装,参数都是一样的。这得益于各个操作系统都采用了类UNIX一切皆文件的思想,将网络接口抽象成一个文件,最终使得接口函数都相似(open,read,write,close)
python中使用socket只需要 import socket
即可
关键函数
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
这里建立了一个socket,第一个参数指定使用(host,port)二维元祖来表示IP和端口号。第二个参数表示使用TCP协议。常用的还有SOCK_DGRAM表示使用UDP协议。
代码
客户端代码
import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.20.195",1234)) while True: t=input() s.send(t.encode('utf8')) #客户端先发送信息 if t == "exit": break t=s.recv(1024).decode("utf8") if t == "exit": break print(t) s.close()
服务器代码
import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(("192.168.20.195",1234)) s.listen(2) sock,addr=s.accept() while True: t=sock.recv(1024).decode('utf8') #服务端先接收信息 if t == "exit": break print(t) t=input() if t == "exit": break sock.send(t.encode('utf8')) s.close()
上面两段代码建立了一个服务器和一个客户端互相发消息,两台电脑自此可以正常通讯了。