python learning Network Programming.py
Socket
# 用一个 Socke t表示“打开了一个网络连接”
# 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
# TCP
# 主动发起连接的是客户端,被动相应的是服务器
# 1. 创建一个基于 TCP 连接的socket
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# AF_INET 指 IPv4 协议。SOCK_STREAM 指面向流的 TCP 协议。
# 初始化了一个 socket 实例,还没有建立连接
# 2. 连接到服务器
# connect 接受的参数是一个 tuple:(ip, port)。输入域名可以通过DNS自动转换为IP地址。
s.connect(('www.sina.com.cn',80))
# 3. 发送数据 send
# 下列数据的意思是:请求返回首页的内容
# TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 4. 接受服务器发来的数据
# 发送完 HTTP 格式请求后,接下来就可以接收新浪服务器返回的数据了:
buffer = []
while True:
d = s.recv(1024) # 1KB
if d:
buffer.append(d)
else: # 数据读取完毕或者连接中断,返回 empty string
break
data = b''.join(buffer) # 这句语句的意思就是使用空字节把 buffer 这个字节列表连接在一起,成为一个新的字节串
# b''是一个空字节,join是连接列表的函数,buffer是一个不断接受到的串的列表
# 例如把[b'ab',b'cd',b'ef']变成 b'abcdef'
# 5. 接受完数据,关闭 socket
s.close()
# 接收到的数据包括HTTP头和网页本身
# 我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件:
header, html = data.split(b'\r\n\r\n',1)
print(header.decode('utf-8'))
with open('sina.html','wb') as file:
file.write(html)
服务器
# 1. 服务器进程绑定一个端口,监听来自客户端的连接
# 四元组来唯一确定一个 socket
# 因为服务器要同时相应多个客户端的请求,所以,每次连接都需要一个新的进程或者线程来处理。
# 我们来编写一个简单的服务器程序,它接收客户端连接,把客户端发过来的字符串加上Hello再发回去。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
# 绑到本地地址,端口号9999
# 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
s.bind(('127.0.0.1', 9999))
# 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量:
s.listen(5)
print('Waiting for connection...')
# 服务器程序通过一个永久循环来接受来自客户端的连接
# accept()会等待并返回一个指示客户端连接的socket 和客户端 ip 地址:
import threading
import time
def tcplink(sock, addr):
print('Accept new connection from %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 closed.' % addr)
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
客户端
import socket
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'Chang', b'KangKang', b'Wangbin']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
UDP server
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))
print('Bind UDP on 9999....')
while True:
# UDP: 不需要调用listen()方法,而是直接接收来自任何客户端的数据:
data, addr = s.recvfrom(1024) # recvfrom()方法返回数据和客户端的地址与端口
print('Received from %s:%s' % addr) # 把数据用UDP发给客户端
s.sendto(b'Hello, %s!'% data, addr)
UDP client
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'zhao', b'Chang']:
s.sendto(data, ('127.0.0.1',9999))
print(s.recv(1024).decode('utf-8'))
s.close()
python learning Network Programming.py的更多相关文章
- python learning Functional Programming.py
print(abs(-10)) # 函数可以是变量 f = abs f(-10) def add(x,y,f): return f(x) + f(y) x = -5 y = 6 f = abs # 简 ...
- Python socket – network programming tutorial
原文:https://www.binarytides.com/python-socket-programming-tutorial/ --------------------------------- ...
- python learning Exception & Debug.py
''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...
- python learning Regular Expression.py
# 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规 ...
- python network programming tutorial
关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...
- Neural Network Programming - Deep Learning with PyTorch with deeplizard.
PyTorch Prerequisites - Syllabus for Neural Network Programming Series PyTorch先决条件 - 神经网络编程系列教学大纲 每个 ...
- [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming
第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...
- 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记
第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...
- Python Lambda & Functional Programming
Python Lambda & Functional Programming 函数式编程 匿名函数 纯函数 高阶函数 # higher-order functions def apply_tw ...
随机推荐
- python执行时遇到 KeyError: b'somevar' 时需要想到的
虽然这个问题很小,但我觉得很有必要单独拿出来强调一下. 这样在遇到类似错误的时候可以很快反应过来,进而节约了时间. 这里我拿 shelve 模块举例(shelve的作用大致就是把python变量存放到 ...
- django中间件-12
目录 自定义中间件 函数定义 类定义 中间件的执行顺序 在django中,中间件其实就是一个类,他是一个可以介入django的 request 和 response 的钩子框架,在请求响应不同的阶段, ...
- VS2010调试和头文件路径设置
1:VS2010 release 调试C/C++ -> 常规 -> 调试信息格式, 修改为程序数据库(/Zi)C/C++ ->优化 -> 优化,修改为已禁用(/Od)链接器 - ...
- pwd的实现20155301
pwd的实现 任务要求: 1) 学习pwd命令 2) 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3) 实现mypwd 4) 测试mypwd 实现过程 1)首先查看是否有有用 ...
- 【转载】COM小结
原文:http://blog.csdn.net/byxdaz/article/details/6595210 一.Com概念 所谓COM(Componet Object Model,组件对象模型),是 ...
- 4- 算法练习leetcode.com
0.五大经典算法 动态规划算法----爬楼梯 分治算法-- 贪心算法---零钱问题 回溯算法---迷宫问题 --深度优先 分支限界法 ----广度优先 1.找出下标范围 1.二分法 li = [1,2 ...
- docker创建image方法以及常用指令介绍
docker -help # 显示帮助 docker COMMAND -help # 帮助信息更详细 docker start “容器名称” # 启动一个或多个容器 docker s ...
- Zabbix实战-简易教程--日志类
一.主动模式和被动模式介绍 要监控日志,必须使用主动模式,那么,什么是主动模式?什么是被动模式呢? 1.主动模式和被动模式 主动模式 主动模式通讯过程: ● Agent打开TCP连接(主动检测变成Ag ...
- How to map Actions to a certain RibbonPage and RibbonGroup using the Application Model or in code
https://www.devexpress.com/Support/Center/Question/Details/S134617/how-to-map-actions-to-a-certain-r ...
- 大数据中HBase集群搭建与配置
hbase是分布式列式存储数据库,前提条件是需要搭建hadoop集群,需要Zookeeper集群提供znode锁机制,hadoop集群已经搭建,参考 Hadoop集群搭建 ,该文主要介绍Zookeep ...