最近在尝试写个 web 开发框架(自己造轮子,纯粹是为了辅助自己探究 Django),也算是在重新复习下 socket 使用。

我们平常使用的流程大致如下(图是从网络上 copy 过来的)

图片描述

看到这张图,应该感到很熟悉,就是这么玩的。

服务端

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

import socket
import time

HOST = 'localhost'
PORT = 9000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(5)

print('sever start...')

while 1:
    print('socket accept')
    # 没有请求进来时,这里会阻塞
    conn, addr = sock.accept()
    time.sleep(2)
    print(conn, addr)
    data = conn.recv(1024)
    conn.send(data)
    conn.close()

客户端

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

import socket

HOST = 'localhost'
PORT = 9000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

sock.sendall('hello world')
data = sock.recv(1024)
print(data)
sock.close()

终端运行

当客户端连接时,服务端结果如下:

sever start...
socket accept
(<socket._socketobject object at 0x105e22ec0>, ('127.0.0.1', 62555))
socket accept
(<socket._socketobject object at 0x105e22f30>, ('127.0.0.1', 62563))
socket accept
(<socket._socketobject object at 0x105e22ec0>, ('127.0.0.1', 62565))
socket accept
(<socket._socketobject object at 0x105e22f30>, ('127.0.0.1', 62566))
socket accept

其他

  • 客户端每次请求都会随机分配一个端口,见上面的 62555, 62563, 62565 等等

  • 没有请求时,进程阻塞,直到有新的请求进来,然后处理

  • 这是一个很粗糙的版本,单进程,请求多时,只能排队


青阳半雪
1.6k 声望24 粉丝

现实与完美之间


引用和评论

0 条评论