Python网络编程之初识TCP,UDP

这篇文章是读了《Python核心编程》第三版(Core Python Applications)的第二章网络编程后的自我总结。 如果有不到位或者错误的地方,还请大家积极指出。

首先谈谈TCP和UDP的不同
这个问题出现在很多次Python面试题中,以下答案是我根据书本来总结出的:

在谈该问题之前,我需要先简单说一下套接字的概念:
套接字是计算机网络数据结构,他体现了“通信端点的”概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将他们比作电话插孔,没有它将无法进行通信。
有两种类型的套接字:基于文件(AF_UNIX)和面向网络(AF_INET)的。总的来说,Python只支持AF_UNIX、AF_NETLINK、AF_TIPC和AF_INET家族。

下面进入正题,不管采用哪种地址家族(AF_INET等),都有两种不同风格的套接字连接。
第一种是面向连接的,这意味着在进行通信之前必须先建立一个连接。这种类型的通信也称为
虚拟电路或流套接字
虚拟电路或流套接字:实现这类连接类型的主要协议是传输控制协议(即为TCP协议),为了创建TCP套接字,必须使用 SOCK_STREAM作为套接字类型。

除此之外还有一种风格的套接字连接,该类型与虚拟电路形成鲜明的对比,它是一种无连接的套接字。这种类型的通信也称为**数据报类型的套接字
数据报类型的套接字:实现该类连接类型的主要协议是用户数据报协议(即为UDP协议),为了创建UDP套接字,必须使用 SOCK_DGRAM 作为套接字类型。

下面说说两种套接字的不同,除了先前提到的TCP需要在通信前建立连接,UDP不需要外,我们需要只要,有得便有舍。
TCP的传输数据方式提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这基本上意味着每条消息可以拆分成多个片段,并且每一条消息片段都能确保能够到达目的地,然后将它们按顺序组合在一起,最后将完整的消息传递给正在等待的应用程序。
UDP的传输方式,虽不要通信前建立连接,,但是在数据传输过程中,并无法保证他的顺序性、可靠性或重复性。However,数据报确实保存了记录边界,所以这意味着消息是以整体发送的。它的**优势**在于,不需要对虚拟电路那样的维护,所以节省很大一笔开销,成本即更加“低廉”。

简单了解完TCP和UDP,下面进入Python中的网络编程。
首先要了解Python中的 socket()模块函数,这一块支持创建套接字。 接下来的代码全部基于Python3.X
socket的一般语法:
socket(socket_family, socket_type, protect=0)
其中,socket_family是AF_UNIX或者AF_INET, socket_type是SOCK_STREAM或SOCK_DGRAM. protect 一般省略

import socket
# 创建TCP/IP套接字
TcpSock = socket(AF_INET, SOCK_STREAM)
# 创建UDP/IP套接字
UdpSock = socket(AF_INET, SOCK_DGRAM)

下面结合之前所学知识,创建**TCP时间戳服务器和TCP时间戳客户端**,再次申明,以下代码全部基于Python3.X

# TCP时间戳服务器
# encoding = 'utf-8'
from socket import *
from time import ctime HOST = '127.0.0.1' #或者 localhost
PORT = 25677 #该通信端口应该和客户端的通信端口一致,如果测试阶段出现[WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次,可以改变这个数字范围为0~65535,小于1024的预留给了系统,尽量不要使用。
BUFSIZ = 1024 #1kb
ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5) while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()
print('...connected from:', addr) while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break tcpCliSock.send(bytes('[%s] %s' % (ctime(), data.decode('utf-8')), 'utf-8')) #这个地方一定要用bytes进行转换成字节,且要主要缩进问题
tcpCliSock.close() tcpSerSock.close() #如果一直有客户端输入,该函数则一直不会调用。
# TCP时间戳客户端
# encoding = 'utf-8'
from socket import * HOST = '127.0.0.1'
PORT = 25677
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR) while True:
data = input('> ')
if not data:
break tcpCliSock.send(bytes(data, 'utf-8')) #同样要用bytes函数转换成字节
data = tcpCliSock.recv(BUFSIZ) if not data:
break print(data.decode('utf-8')) #打印时间戳信息,需要转换成字符串显示在控制台上 tcpCliSock.close()

下面是**UDP时间戳服务器和UDP时间戳客户端**:

#UDP时间戳服务器
# encoding = 'utf-8' from socket import *
from time import ctime HOST = ''
PORT = 23135
BUFSIZ = 1024
ADDR = (HOST,PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR) while True:
print('waiting for message...') data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto(bytes(ctime(), 'utf-8'), addr) print('...received from and returned to:' , addr) udpSerSock.close()
#UDP时间戳客户端
# encoding = 'utf-8' from socket import * HOST = 'localhost' PORT = 23135 BUFSIZ = 1024 ADDR = (HOST,PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) #与TCP不同的是不用connect while True:
data = input('> ')
if not data:
break udpCliSock.sendto(bytes(data,'utf-8'),ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break print(data.decode('utf-8')) udpCliSock.close()

所以,是先运行服务器,还是先运行客户端呢? 毫无疑问,**首先启动服务器(在任何客户端想要试图连接之前)**

以下是运行截图:
TCP时间戳服务器:

TCP时间戳客户端:

UDP时间戳服务器:

UDP时间戳客户端:

后续会继续更改完善文章,包括对代码的注释等,如果有任何问题,欢迎大家在下方留言!~

下一篇将是正则表达式的学习心得...

Python web编程 初识TCP UDP的更多相关文章

  1. 系列文章--Python Web编程

    我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编 ...

  2. python网络编程05 /TCP阻塞机制

    python网络编程05 /TCP阻塞机制 目录 python网络编程05 /TCP阻塞机制 1.什么是拥塞控制 2.拥塞控制要考虑的因素 3.拥塞控制的方法: 1.慢开始和拥塞避免 2.快重传和快恢 ...

  3. python socket 编程(TCP与UDP)

    实验环境:python2 一.TCP编程 1.建立TCP服务器 ①创建TCPServer.py文件 ②编写服务器代码 1)创建socket对象,调用socket构造函数 2)绑定ip端口(IP号和端口 ...

  4. python web编程-概念预热篇

    互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准 ...

  5. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  6. python web编程之网络基础

    1.TCP/IP协议 1)分层 应用层,传输层,网络层,接口层 2)Ip地址 3)域名 4)URL统一资源定位符 格式:    [协议]://[主机]:[端口]/[路径]?[参数] 协议是HTTP,F ...

  7. 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

    一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者 ...

  8. python网络编程(TCP/IP、发邮件)

    TCP/IP 关注公众号"轻松学编程"了解更多. 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容. 为了把全世界的电脑能够连接到一 ...

  9. python web编程 创建一个web服务器

    这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...

随机推荐

  1. 为什么你应该学习Go语言?

    终于等到你!Go语言--让你用写Python代码的开发效率编写C语言代码. 为什么互联网世界需要Go语言 世界上已经有太多太多的编程语言了,为什么又出来一个Go语言? 硬件限制:摩尔定律已然失效 摩尔 ...

  2. 在Linux上安装nginx时遇到的问题,真的好坑啊!!!!

    解决了两个小时愣是卡着没动,结果一请大神问题就迎刃而解,怪自己太粗心,一下午差点就被这个问题安排的明明白白,直接上问题: makeFile时的问题:   checking for OS + Linux ...

  3. Java中 a+=b 和 a=a+b 有什么区别?

    今天舍友突然问我"在java中 a+=b 和a=a+b 有什么区别",说这是一道面试题.当时就不假思索的回答:"一样啊",然后他说有位面试者也回答说一样,所以被 ...

  4. iptables的删除命令中的相关问题

    最近在做一个VPN中间件的配置工作,在配置iptables的时候,当用户想删除EIP(即释放当前连接),发现使用iptables的相关命令会提示错误. iptables: Bad rule (does ...

  5. gemfire基本使用以及spring-data-gemfire的使用

    1.安装程序的使用 locator 启动locator gfsh>start locator --name=locator1 指定端口启动 gfsh>start locator --nam ...

  6. mvn deploy:deploy-file命令

    mvn deploy:deploy-file -DgroupId=com.gome -DartifactId=jwebservices -Dversion=2.0 -Dpackaging=jar -D ...

  7. Solve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_trans

    I have been suffering from infamous hibernate exception org.hibernate.LazyInitializationException: c ...

  8. C++类的this指针详解

    这篇文章主要讲解隐式this指针的概念,以及如何使用,包含const 先直接给出一个C++Primer里的类,你可能还不能完全看懂,但是不着急,我们一点点解释 class Sales_data { s ...

  9. 2018年蓝桥杯java b组第五题

    标题:快速排序 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. 我在使用(a, l, r, ...

  10. Redis数据库之服务器主从配置

    目的 主要培养对分布式REDIS主从复制架构运用的能力.理解并掌握REPLICATION工作原理的同时,能独立配置Replication ,使数据库运行在主从架格上.针对主从复制架构的运用,着力掌握S ...