博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习之网络编程
阅读量:6867 次
发布时间:2019-06-26

本文共 2903 字,大约阅读时间需要 9 分钟。

Python学习目录

互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释。最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做"应用层"(Application Layer),中间的三层(自下而上)分别是"链接层"(Link Layer)、"网络层"(Network Layer)和"传输层"(Transport Layer)。越下面的层,越靠近硬件;越上面的层,越靠近用户。

TCP编程

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

客户端

创建Socket

# 导入socket库:import socket# 创建一个socket:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立连接:s.connect(('www.sina.com.cn', 80))复制代码

创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6SOCK_STREAM指定使用面向流的TCP协议,这样,一个Socket对象就创建成功,但是还没有建立连接。

连接服务器

s.connect(('www.sina.com.cn', 80))复制代码

注意参数是一个tuple,包含地址和端口号。

发送请求

# 发送数据:s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')复制代码

TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。

接收数据

# 接收数据:buffer = []while True:    # 每次最多接收1k字节:    d = s.recv(1024)    if d:        buffer.append(d)    else:        breakdata = b''.join(buffer)复制代码

关闭Socket

# 接收数据:buffer = []while True:    # 每次最多接收1k字节:    d = s.recv(1024)    if d:        buffer.append(d)    else:        breakdata = b''.join(buffer)复制代码

服务器

创建Socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)复制代码

创建一个基于IPv4和TCP协议的Socket。

绑定监听的地址和端口

# 监听端口:s.bind(('127.0.0.1', 9999))s.listen(5)print('Waiting for connection...')复制代码

listen()方法传入的参数指定等待连接的最大数量。

接受客户端连接

while True:    # 接受一个新连接:    sock, addr = s.accept()    # 创建新线程来处理TCP连接:    t = threading.Thread(target=tcplink, args=(sock, addr))    t.start()复制代码

每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接:

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)复制代码

UDP编程

TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口:s.bind(('127.0.0.1', 9999))复制代码

创建Socket时,SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据:

print('Bind UDP on 9999...')while True:    # 接收数据:    data, addr = s.recvfrom(1024)    print('Received from %s:%s.' % addr)    s.sendto(b'Hello, %s!' % data, addr)复制代码

recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。

注意这里省掉了多线程,因为这个例子很简单。

客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)for data in [b'Michael', b'Tracy', b'Sarah']:    # 发送数据:    s.sendto(data, ('127.0.0.1', 9999))    # 接收数据:    print(s.recv(1024).decode('utf-8'))s.close()复制代码

从服务器接收数据仍然调用recv()方法。

转载地址:http://zrdfl.baihongyu.com/

你可能感兴趣的文章
在敏捷测试中如何设计用例
查看>>
使用JSOM创建一个SharePoint网站计数器
查看>>
老硬盘华丽变身高速硬盘
查看>>
IT公司规模对技术人员知识增长率的影响
查看>>
由日企衰败联想到的运维管理问题
查看>>
Outlook中轻松添加LDAP服务
查看>>
线上咨询交易火爆 新模式还是新机遇?
查看>>
比较使用sql*loader的直接加载方式和传统加载方式的性能差异
查看>>
HAProxy Nginx LVS Apache总结篇
查看>>
BlackBerry Localization sample (1)
查看>>
类模版和函数模版需要注意的
查看>>
用 Tornado 实现简单的在线代理
查看>>
函数指针和指针函数
查看>>
HTML 如何让图片全屏的问题
查看>>
silverlight 如何在浏览器的新页面里打开一个xaml
查看>>
SQL Tuning Advisor使用实例
查看>>
server-U上传中文文件乱码
查看>>
编程珠玑:用后缀数组寻找最长重复字符串
查看>>
Java写到.txt文件,如何实现换行
查看>>
通过http proxy访问git 服务
查看>>