Python web编程 初识TCP UDP

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时间戳客户端:

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

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

原文地址:https://www.cnblogs.com/lesliechan/p/11498357.html

时间: 2024-08-01 07:13:04

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

三、初识TCP/UDP(传输层)

一.初识TCP/UDP(传输层) 引言:TCP(Transmission Control Protocol),又叫传输控制协议,UDP(User Datagram Protocol),又叫用户数据报协议.两者都是是传输层协议,但他们的通信机制与应用场景不同. 1.TCP与UDP区别 特点 TCP UDP 传输方式 字节流 数据报 连接性 面向连接 面向非连接 可靠性 可靠 不可靠 传输效率 慢 快 面向字节流(TCP) 面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),TC

Python Web编程系列

我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编程(五)Python Web编程(六)Python Web编程(七) Python Web编程(八) 出处:http://www.cnblogs.com/game-over/category/105911.html

python socket编程 ,tcp,udp服务端客户端创建

转自http://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 下面讲的是Socket模块功能 1.Socket 类型 套接字格式: socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号

python+web编程学习总结记录(一)

近来一个多星期一直在学习py的web编程,从零开始,短暂时间接受的很多知识都需要消化吸收,所以在这里把这个过程梳理一遍,尽量用自己的语言去描述这些知识点. 首先是web编程的必备知识:HTTP协议.超文本传输协议(HTTP),是一种通信协议,按照定义来直接去看容易一头雾水,但其实只需要了解:web服务器和客户端之间交流,必须要遵守统一的规矩,不然就跟你说汉语我说英文一样,互相不知对方在说什么.这个统一的规矩或者格式就是HTTP协议 而服务器和客户端之间的通信方式简而言之就是,客户端给服务器发了一

python web编程-概念预热篇

互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准协议是HTTP(超文本传输协议).HTTP协议是TCP/IP 协议的上层协议,这意味着HTTP 协议依靠TCP/IP 协议来进行低层的交流工作.它的职责不是路由或者传递消息(TCP/IP 协议处理这些),而是通过发送.接受HTTP 消息来处理客户端的请求. HTTP 协议属于无状态协议,它不跟踪从一

Python网络编程02----基于UDP的Python简易服务器

UDP 服务器不是面向连接的,所以不用像 TCP 服务器那样做那么多设置工作.事实上,并不用设置什么东西,直接等待进来的连接就好了. ss = socket() # 创建一个服务器套接字 ss.bind() # 绑定服务器套接字 inf_loop: # 服务器无限循环 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) ss.close() # 关闭服务器套接字 服务器端: from socket import * from time import ctime

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

这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里的静态页面,但是要怎么做到洞察不同用户同的输入?比如说表单提交等来产生不同的返回结果呢 一个简单的思路是web服务器把这些请求提交给另外一个程序,它接受用户输入然后处理,根据输入生成一个静态的html文件交给web服务器 复杂上面这样的流程程序就是CGI,是单独出来的 创建HTML 的CGI 应用程

Python网络编程—(TCP、UDP区别)

tcp套接字和udp套接字编程区别 1.流式套接字是以字节流方式传输数据,数据报套接字以数据报形式传输 2.tcp套接字会有粘包,udp套接字有消息边界不会粘包 3.tcp套接字保证消息的完整性,udp套接字则不能 4.tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要 5.tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom 原文地址:https://www.cnblogs.com/maplethefox/p/109890

python网络编程实现TCP和UDP连接

实现TCP #!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket # 创建一个socket: s = socket.socket(socket.AF_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: