网络编程

网络编程对所有开发语言都是一样的,Python也不例外。用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。

TCP编程

TCP建立可靠连接,并且通信双方都可以以流的形式发送数据
Socket是网络编程的一个抽象概念。
通常我们用一个Socket表示打开了一个网络链接"。
打开一个Socket需要目标计算机的IP地址和端口号,再指定协议类型。

UDP编程

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

大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。

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

客户端

客户端编程步骤:(必要的1,2,5)

  1. 创建一个基于TCP连接的Socket

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为 AF_INET6SOCK_STREAM指定使用面向流的TCP协议。

  2. 建立连接

    s.connect('www.sina.com.cn', 80)

    IP地址:www.sina.com.cn 端口:80 (Web服务的标准端口:80 SMTP服务:25 FTP服务:21 端口号小于1024的是Internet标准服务的端口,大于1024的可以任意使用)

  3. 发送数据

    s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')

  4. 接收数据

    s.recv(1024)

    每次最多接收最大字节数

  5. 关闭连接

    s.close()

  6. 分析数据

    接收的数据包括HTTP头和网页本身,分离即可

    header, html = data.split(b'\r\n\r\n', 1)

    print(header.decode('utf-8'))

  7. 写入 sina.html 文件

import socket

# 创建一个Socket
s = socket.socket(socket.SG_INET, socket.SOCK_STREAM)
# 建立连接
s.connect('www.sina.com.cn', 80) # 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.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, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
f.write(html) # 只需要在浏览器中打开这个sina.html文件,就可以看到新浪的首页了。

服务端

服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。

所以,服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接。由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。

一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。

但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。

我们来编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。

步骤:

1 .socket()创建一个基于IPv4和TCP协议的Socket:

2. 绑定监听的地址和端口

3. listen()监听端口,传入的参数指定等待连接的最大数量:

4. accept()等待并返回一个客户端的连接:

5. 定义函数用于创建新线程或进程(用来同时接收多个客户端)

服务端程序

# 1. 创建一个基于IPv4和TCP协议的Socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)` # 2. 绑定监听端口:
s.bind(('127.0.0.1', 9999)) # 3. 监听端口
s.listen(5)
print('Waiting for connection...') # 4. 等待并返回一个客户端的连接:
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start() # 5. 每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接: 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)

客户端程序

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

我们需要打开两个命令行窗口,一个运行服务器程序,另一个运行客户端程序即可。

UDP编程

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

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

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

服务端

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999)) 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)

客户端


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()

注意: UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。

Python中级 —— 04网络编程的更多相关文章

  1. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  2. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  3. Python之路 - 网络编程之粘包

    Python之路 - 网络编程之粘包 粘包

  4. Python之路 - 网络编程初识

    Python之路 - 网络编程初识 前言

  5. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  6. 【循序渐进学Python】15.网络编程

    Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...

  7. python 之socket 网络编程

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  8. python:socket网络编程

    Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”. 模块 import socket 创建套接字 socket.socket( ...

  9. 周末班:Python基础之网络编程

    一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...

随机推荐

  1. ButterKnife 初体验

    ButterKnife 环境搭建 在project的build.gradle文件中添加依赖的插件 //ButterKnife 的插件 // classpath 'com.jakewharton:but ...

  2. .net core Web应用启动类

    在ASP.NET Core中,Startup类为Web应用的入口类,用于配置Web服务的管道/过滤器以及Web应用所能用到的服务.在启动Web应用后,ASP.NET将在主库中查询名为Startup的类 ...

  3. IntelliJ Idea编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8

    解决办法: 1.Project Settings-Modules,选择项目,选择language level 8 2.选中项目,右击选择Maven-->Reimport, 再次编译. 3.Fil ...

  4. [翻译] ZLSwipeableView

    ZLSwipeableView A simple view for building card like interface like Tinder and Potluck. ZLSwipeableV ...

  5. 点开无线显示"已连接 安全",但是点击下面无线图标却显示"无法连接internet",解决方案

    管理员权限运行“命令提示符” 输入:netsh winsock reset 然后重启电脑即可

  6. 沉淀再出发:redis的安装和使用

    沉淀再出发:redis的安装和使用 一.前言 下面让我们看看Redis这个键值对内存数据库的使用方法和相关注意事项. 二.Redis的安装和使用 2.1.Redis的定义 REmote DIction ...

  7. 使用Visual Studio Code开发Arduino

    首发于MSPrecious成长荟 https://zhuanlan.zhihu.com/p/30868224 使用Visual Studio Code开发Arduino 1.下载安装 VS Code ...

  8. January 03 2017 Week 1st Tuesday

    It is always morning somewhere in the world. 世界上总是有一个地方可以看到阳光. There may be always someone who can e ...

  9. 验证 Xcode是否有效方法

    苹果给出了验证 Xcode 的方法,需要用户在终端中执行下面的命令: spctl --assess --verbose /Applications/Xcode.app 如果 Xcode 从 Mac A ...

  10. LINUX下OA搭建