Python 其实能做很多事情,比如服务器
首先我们想一下我们上网的流程,我们在浏览器或者点击链接进入一个网址,其实都是像目标服务器发送请求,然后它们把界面给我们看,python就能很简单的把它们实现
import socket
#定义自己的ip和端口
HOST, PORT = '172.18.74.21', 8080
#实例化scoket
"""
它有三个参数,我们这里全是默认就可以了
第一个参数:地址簇
socket.AF_INET 表示IPV4(默认)
socket.AF_INET6 表示IPV6
socket.AF_UNIX 只能用于单一的Unix系统进程间的通信
第二个参数:类型
socket.SOCK_STREAM 流式socket for TCP(默认)
socket.SOCK_DGRAM 数据格式socket,for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP,IGMP等网络报文,可以通过IP_HDRINCL套接字选项由用户构造IP头
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序,SOCK_RDM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文,SOCK_RAM通常仅限于高级用户或管理员运行的程序使用
socket.SOCK_SEQPACKET 可靠的连续数据包服务
第三个参数:协议
默认与特定地址家族相关的协议,如果是0 则系统就会根据地址格式和套接类别,自动选择一个合适的协议
"""
listen_socket = socket.socket()
"""
设置socket
一般不会立即关闭而经历TIME_WAIT的过程
便于重用
"""
listen_socket.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR, 1)
#这种是在默认的AF_INET下这样以元组的形式存在即(ip,port)
listen_socket.bind((HOST, PORT))
#开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量
listen_socket.listen(1)
#循环接受消息
while True:
#得到链接对象和地址
client_connection, client_address = listen_socket.accept()
#接受1024个字节
request = client_connection.recv(1024)
print(request)
#定义返回内容
http_response = b"""
HTTP/1.1 200 OK\r\n
\r\n
Hello,world!
"""
#发送应答消息
client_connection.send(http_response)
#关闭连接
client_connection.close()
访问172.18.74.21:8080,打开网址的效果是这样的
很简单吧,不到50行代码就完成了一个简单web服务器的搭建
最后附上全部代码
import socket
HOST, PORT = '172.18.74.21', 8080
listen_socket = socket.socket(socket.AF_INET,
socket.SOCK_STREAM,0)
listen_socket.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print('Serving HTTP on port %s ...' % PORT)
while True:
client_connection, client_address = listen_socket.accept()
request = client_connection.recv(1024)
print(request)
http_response = b"""
HTTP/1.1 200 OK\r\n
\r\n
Hello,world!
"""
client_connection.send(http_response)
client_connection.close()