一、网络基础

在学习网络编程前,要对网络通信的五层协议有所了解,那什么是协议呢,协议就是各方规定遵守的一种标准。

网络通信就像寄信件,是信息与数据的交换,而在生活中我们寄信件,信件也不是从我们手里瞬间到收件人手里,每一次信件通信,都会经历这样几个固定流程:写信、装信封、投到邮箱、邮局取件、运输到目的地邮局、目的地邮局根据详细地址派送、收件人收件、拆信封、读信。

网络通信也是同样的道理,数据的传输总有一定的流程:发送端程序将数据打包,给数据包印上目标地址,将数据包交给网关,通过路由转发到达目的网络,目的网络网关在根据详细地址分发、目的主机接收数据、拆包、读数据。

这中间我们按照每部分负责的任务的不同,将整个通信划分为五层(分法不唯一,这是最易理解的一种),由下到上分别是物理层、数据链路层、网络层、运输层、应用层,每一层都将较下的一层完全封装,消除通信双方软硬件的差别,而每一层又有约定好的规则以和对方通信,我们这篇文章所要讲的,就是发生在运输层的通信。

我们先来思考一个问题:一台主机的一个进程发送数据时,是如何标识它是发送给目标主机的哪个进程呢?目标主机接受到数据时,由如何判断这份数据是发送给本机的哪个进程呢?

这就是运输层的任务,也就是说,运输层负责两个主机中的应用进程之间的通信。那么上面的问题到底是怎么解决的呢?这就要提到一个新的概念:套接字。

套接字的概念很简单,每台主机有一个唯一的主机地址标识,同时主机内还有标识自己进程的序号id,称作端口,将这两个标识符结合就构成了一个套接字(socket),这个套接字能唯一标识网络中的一个进程。接下来我们的网络编程,都是围绕这个套接字展开的。

运输层的协议主要有UDP和TCP协议,这两个协议都是为了解决进程通信,它们的区别主要是这几点:UDP是无连接、不可靠协议,TCP是有连接、可靠协议,连接指的是通信前要建立连接(连接提供了许多功能:确认、流量控制、连接管理等),可靠指的是如果数据未抵达有对应处理(不可靠则指只负责发送数据)。

这样就了解的差不多了,当然,关于运输层的技术还有很多,难点重点都没有提到,有兴趣的同学可以自己再学习。

二、通信模式

对我们来说,进行网络通信的目的是为了获取信息,而互联网上的信息需求者远远多于信息提供者,不止如此,信息的提供者必须24小时立即回复需求者的请求,这样就产生了客户服务器模式。客户服务器模式是一个逻辑概念,它将主机分为两类,等待请求的是服务器端、发起请求的是客户端,所以服务器端的套接字是必须是公开的,客户端的套接字可以在请求时给服务器端。

三、实现

对UDP来说:因为不需要建立连接,所以只需要在两台主机上各构造一个socket,就能直接发送和接收数据了。

对TCP来说:首先需要建立连接,一个连接就是一对手动绑定的socket,连接成功后就能收发数据了。

结合客户服务端模式,对同一种协议,socket的构造方法也按客户端和服务器分为两种。

话不多说,上代码!

这是基于TCP协议的:

#socket_server_tcp# import socket
from socket import *
ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)while True:print('服务端开始运行了')conn,addr=tcp_server.accept() #服务端阻塞print('双向链接是',conn)print('客户端地址',addr)while True:try:data=conn.recv(buffer_size)print('客户端发来的消息是',data.decode('utf-8'))conn.send(data.upper())except Exception:breakconn.close()tcp_server.close()

#socket_client_tcp# import socket
from socket import *
ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)while True:msg=input('>>: ').strip()if not msg:continuetcp_client.send(msg.encode('utf-8'))print('客户端已经发送消息')data=tcp_client.recv(buffer_size)print('收到服务端发来的消息',data.decode('utf-8'))tcp_client.close()

接下来是基于UDP协议的:

# socket_server_udpfrom socket import *
ip_port=('127.0.0.1',8080)
buffer_size=1024udp_server=socket(AF_INET,SOCK_DGRAM) #数据报
udp_server.bind(ip_port)while True:data,addr=udp_server.recvfrom(buffer_size)print('收到来自{}的消息:{}'.format(addr, data))udp_server.sendto(data.upper(),addr)

# socket_client_udpfrom socket import *
ip_port=('127.0.0.1',8080)
buffer_size=1024udp_client=socket(AF_INET,SOCK_DGRAM) #数据报while True:msg=input('>>: ').strip()udp_client.sendto(msg.encode('utf-8'),ip_port)data,addr=udp_client.recvfrom(buffer_size)# print(data.decode('utf-8'))print('收到服务端发来的消息', data)

运行下试试!

这两对代码已经能实现基本的功能,但还有许多功能没有实现,如TCP版不能同时连接多用户,粘包问题(一次接收的数据如果大于缓存区大小就会把剩下的内容附加到下次接受的开头),这些我们放到下次来讲。

转载于:https://www.cnblogs.com/wangxinwen/p/9826263.html

Python网络编程(一)相关推荐

  1. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  2. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  3. python编程入门指南怎么样-学习python网络编程怎么入门

    第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一 ...

  4. python编程实例下载-python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...

  5. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  6. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  7. python 网络编程 问题记录

    191223 python 网络编程 套接字的初使用 在本机配置服务端和客户端后,运行没问题:将服务端代码弄到另一台电脑上后启动,用原来的电脑去连接它,就连不上了,不知啥原因,是ip自动获取和指定ip ...

  8. python网络编程(苦肝一夜,近万字)

    文章目录 一.TCP/IP简介 二.网络设计模块 1.Socket简介 2.python中的socket模块,使用该模块建立服务器需要6个步骤. 1.创建socket对象. 2.将socket绑定(指 ...

  9. python网络编程证书_《Python网络编程基础》笔记

    python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...

  10. Python 网络编程(Socket)

    Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...

最新文章

  1. 星际2正在等待暴雪服务器的响应,win7系统玩星际2一直停留在"正在更新暴雪启动器"页面的解决方法...
  2. Java程序员从笨鸟到菜鸟之(一)开发环境搭建,基本语法,字符串,数组
  3. Qt OpenGL 问题总结
  4. 启动窗口画面类CSplashWnd
  5. 面试官重点考察求职者这5项能力
  6. php聊天室禁止提交,phpcms v9禁止提交信息到官网方法详解
  7. 3-17Pytorch与线性代数运算
  8. 管理感悟:领导如何处理拍马
  9. 关于只针对ie7浏览器的css问题
  10. 地震日记-2008-05-14
  11. 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
  12. 利用C51单片机内部函数_corl_函数实现LED流水灯。
  13. fi sap 凭证冲销 稅_sap如何冲销凭证 SAP技术篇之一SAP凭证冲销总结 - 电脑常识 - 服务器之家...
  14. LeetCode 848. Shifting Letters
  15. 父爱,是一首深沉的诗。
  16. r720换固态硬盘后如何重装系统_电脑安装完固态硬盘后如何重装系统?
  17. 比比网开源的一款头像制作小程序
  18. Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS
  19. service mysql k8s_Kubernetes/K8S基础使用方法总结【五】——Service
  20. 中高级Java面试题解析,剑指BATJ,提前祝大家程序员节快乐

热门文章

  1. centos7通过yum安装nginx以及其简单配置使用
  2. 天下武功,唯快不破 - O'Reilly Velocity China 2011 PPT汇总
  3. 如何用计算机制作动态图,电脑怎么制作gif动态图
  4. 【神经网络】Pytorch构建自己的训练数据集
  5. 2020鸿蒙系统pc版,华为将在2020年发布鸿蒙操作系统2.0版,应用于创新国产PC电脑...
  6. 伊美尔在港招股书失效:首次冲刺上市折戟,曾多次遭到处罚
  7. Ubuntu 18.04 安装Qt 5.12.0
  8. java 音频倍速播放_如何让视频加速播放
  9. [转载]如何用JDO开发数据库应用(3)
  10. Gaussian Blurring