最近在尝试写个 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 等等
没有请求时,进程阻塞,直到有新的请求进来,然后处理
这是一个很粗糙的版本,单进程,请求多时,只能排队
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。