网络编程初涉

版权声明:其他网站转载请注明原始链接,尽量不要破坏格式 https://blog.csdn.net/landstream/article/details/72644014

网络编程初涉

套接字 socket 的分类说明

用于进程间通信,分为:
1. 基于文件系统的通信
2. 面向网络的进程通信

具体技术

  1. AF_Unix(address family Unix)—— UNIX套接字,基于文件系统进行传输,比如同一台机器上的不同进程之间的通信。
  2. 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 的异步系统

  1. Twisted

  2. Greenlets

  3. Tornado

  4. Diesel

  5. Concurrence

  6. Eventlet

  7. Gevent

猜你喜欢

转载自blog.csdn.net/landstream/article/details/72644014