python写简单的web静态服务器,对socket的深入理解。

import socket

from multiprocessing import Process

import time

#...使用socket创建简单的静态服务器


def func1(sock):  # 子进程实现的功能
    read_data = sock.recv(2014)    # 接受套接字传入的数据

    if len(read_data) == 0:  
    # 判断客户端关闭/html协议内容未接收到的情况下。
        print('client close....')
        print(sock)
        sock.close()
    else:  # 能够获取read_data

        split_data = read_data.decode().splitlines()
        print(split_data[0])   # 获取用户请求文件

        response_state_line = 'HTTP/1.1 200 OK\r\n'
        response_headers = 'Content-Type: text/plain\r\n'
        response_body = "hello worldjjjjj"

        print("======test1=======")
        # web服务器根据客户请求返回内容显示在web上
        response_data = response_state_line+response_headers+"\r\n"+response_body
        sock.send(response_data.encode())
        print("============test3===========")
        sock.close()


def main():   #主进程--设置监听端及绑定ip
    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_addr = ('192.168.199.214', 10000)
    listen_socket.bind(server_addr)
    listen_socket.listen(128)

    while True:
        #主进程不断尝试接受浏览器请求连接
        new_socket, peer_addr = listen_socket.accept()
        print("asss")

        p = Process(target=func1, args=(new_socket,))
        p.start()

        print("父进程", new_socket)
        time.sleep(10)

        new_socket.close()
if __name__ == '__main__':
    main()


![运行情况:显然如看到的不同的在accept不断尝试连接情况下,socket的fd是可能不变的,在windows条件下,可能会被其他进程暂用fd,但是假设是相同的fd,浏览器进程还在不断的调用不同的端口进行连接,一直到主进程的socket关闭(因为主进程的new_socket和子进程的new_socket,不是同一个socket(fd不同),但是他们绑定了相同的ip,浏览器ip和端口](http://img.blog.csdn.net/20170608001713764?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)


![这是对端口号的描述,很明显端口号是不同的。但是为什么会在子进程的new_socket没有读取数据情况下进行else操作,即打印出---test1----,----test2----,个人猜想可能是在子进程的socket没法读取数据的情况下,擅自调用了父进程的socket,这跟不同进程间的变量是独立的又相矛盾](http://img.blog.csdn.net/20170608002241298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

# ---------------------跪求正确见解------------------------
# -------------求饭吃 0.0~~~

![这里写图片描述](http://img.blog.csdn.net/20170608003338272?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](http://img.blog.csdn.net/20170608003356741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hlbl9jaG9uZ19f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)



猜你喜欢

转载自blog.csdn.net/Chen_chong__/article/details/72907510