版权声明:其他网站转载请注明原始链接,尽量不要破坏格式 https://blog.csdn.net/landstream/article/details/72644014
网络编程初涉
套接字 socket 的分类说明
用于进程间通信,分为:
1. 基于文件系统的通信
2. 面向网络的进程通信
具体技术
- AF_Unix(address family Unix)—— UNIX套接字,基于文件系统进行传输,比如同一台机器上的不同进程之间的通信。
- AF_INET 是面向网络的套接字,AF_INET6用于IPv6协议。
套接字地址
主机:端口号
面向连接的套接字
基于TCP/IP协议,需要建立和维护虚拟电路链接。在 Python 中对应字段是 SOCK_STREAM
无连接的套接字
基于UDP/IP 协议进行传输,相对TCP/IP来讲,可靠性较低,但传递时延更短,在 Python 中对应字段是 SOCK_DGRAM
用于实验的脚本
在 Python 3 环境下编写实验脚本:
访问外部网站
# coding:utf-8
import socket
from time import ctime
__python__ = 3.6
# 创建一个socket, AF_INET 是网络间进程通信的协议族
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
""" TCP 客户端实验脚本 """
# 建立连接
s.connect(("www.sina.cn", 80))
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.cn\r\nConnection: close\r\n\r\n')
# 接收数据:
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
# 关闭连接:
s.close()
header, port, html = data.split(b'\r\n\r\n', 2)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
f.write(html)
服务器脚本
# coding:utf-8
import socket
from time import ctime
""" TCP服务器实验脚本 """
HOST = 'localhost'
PORT = 8080
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_sock.bind(ADDR)
tcp_server_sock.listen(5)
try:
while True:
print("waiting for connection...")
tcp_cli_sock, addr = tcp_server_sock.accept()
print('...connected from:', addr)
while True:
data = tcp_cli_sock.recv(BUFSIZE)
if not data:
break
send_str= '[%s] %s'%(
bytes(ctime(), 'utf-8'), data)
send_data = send_str.encode("utf-8")
tcp_cli_sock.send(send_data)
tcp_cli_sock.close()
except (EOFError, KeyboardInterrupt) as errors:
print(errors)
finally:
tcp_server_sock.close()
客户端脚本
# coding:utf-8
__python__ = 3.6
import socket
""" 同服务器进行交互的客户端脚本 """
HOST = 'localhost'
PORT = 8080
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcp_cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_cli_sock.connect(ADDR)
try:
while True:
send_str = input('> ')
if not send_str:
break
tcp_cli_sock.send(send_str.encode("utf-8"))
data = tcp_cli_sock.recv(BUFSIZE)
if not data:
break
print(data)
except (EOFError, KeyboardInterrupt) as errors:
print(errors)
finally:
tcp_cli_sock.close()
基于 Python 的异步系统
Twisted
Greenlets
Tornado
Diesel
Concurrence
Eventlet
Gevent