参考网易云课堂以及大牛
**TCP/IP **
首先为一张大图:

TCP/IP协议只是整个网络协议的一部分;
网络协议,其实就是:为了网络交换所建立的规则、标准和约定;
协议规定了信息传递的格式、顺序、意义和信息,以及与之相针对的收发信息所采取的动作(actions)
协议的三个要素:语法、语意和时序

网络模型划分为:
OSI 七层模型:注意在数据封装过程中,每层协议加入了一些控制信息和地址,以便找到下一个访问的地址(端到端),并且添加了一些安全性手段;

我们需要对网络传输,特别是TCP/IP协议和socket有一定的了解。socket是进程间通信的一种方法 (参考Linux进程间通信),它是基于网络传输协议的上层接口。socket有许多种类型,比如基于TCP协议或者UDP协议(两种网络传输协议)。其中又以TCP socket最为常用。TCP socket与双向管道(duplex PIPE)有些类似,一个进程向socket的一端写入或读取文本流,而另一个进程可以从socket的另一端读取或写入,比较特别是,这两个建立socket通信的进程可以分别属于两台不同的计算机。所谓的TCP协议,就是规定了一些通信的守则,以便在网络环境下能够有效实现上述进程间通信过程。双向管道(duplex PIPE)存活于同一台电脑中,所以不必区分两个进程的所在计算机的地址,而socket必须包含有地址信息,以便实现网络通信。一个socket包含四个地址信息: 两台计算机的IP地址和两个进程所使用的端口(port)。IP地址用于定位计算机,而port用于定位进程 (一台计算机上可以有多个进程分别使用不同的端口)。
** 客户端:建立一个socket连接**
以百度首页为例:
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#代表 TCP ipv4协议
s.connect(("www.baidu.com",80))
"""
80端口是Web服务的标准端口,备注:端口号小于1024的是
Internet标准服务的端口,端口号大于1024的,可以任意使用。
"""
s.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\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, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('baidu.html', 'wb') as f:
f.write(html)
** 服务器端:建立一个本地服务器**
import socket
import time
import threading
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
HOST = '127.0.0.1'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP-socket
s.bind((HOST, PORT)) # 赋予socket以固定的地址和端口
s.listen(5) # 监听接口
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
"""
每个连接都必须创建新线程(或进程)来处理,
否则,单线程在处理连接的过程中,无法接受其他客户端的连接:
"""
sock.close()
----#下面为一个本地客户端
import socket
HOST="127.0.0.1"
PORT=9999
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.close()
----运行结果:
Welcome!
Hello, Michael!
Hello, Tracy!
...
网友评论