Python基础---网络编程

目录

一、网络编程引入

二、软件开发架构

(一)客户端服务端概念

(二)C/S架构

(三)B/S架构

三、计算机网络

(一)概念

(二)查看IP地址的方法

方法一

方法二

(三)端口

(四)网络协议(TCP/IP协议簇)

应用层

传输层

网络层

(五)OSI模型

四、Socket

(一)概念

(二)分类

基于文件

基于网络

(三)socket参数详解

(四)基于TCP协议的Socket使用

(五)基于UDP协议的Socket使用


一、网络编程引入

我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。由于在不同机器上的程序需要通信,才产生了网络。

通过网络让不同计算机上运行的程序进行通信

例如:两个人通过两台电脑上的QQ进行聊天

二、软件开发架构

(一)客户端服务端概念

客户端:就是我们常用的程序。例如qq、微信,浏览器等等。

服务端:要一直运行着给别人提供服务的机器(电脑、服务器)。

(二)C/S架构

C/S即:Client与Server ,中文意思:客户端与服务器端架构。

这里的客户端一般泛指客户端应用程序exe,程序需要先安装后,

才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

C/S架构 应用程序 长连接 断网程序即止

两个熟悉的人一直聊

(三)B/S架构

B/S即:Browser与Server,中文意思:浏览器端与服务器端架构。

只需在浏览器上通过HTTP去请求服务器端相关的资源(网页资源)。

B/S架构 web程序 短连接 断网网页仍存在,一次请求一次问答结束后即断开,断网不会有影响  

两个陌生的人尬聊

三、计算机网络

(一)概念

一开始只有MAC地址,但是MAC地址找起来非常麻烦,因此根据ARP协议将MAC地址转换为便于找到且具有唯一性的IP地址。

IP地址范围:0.0.0.0-255.255.255.255。

一个ip地址通常写成四段十进制数,例:172.16.10.1

一个特殊的地址 127.0.0.1 本地回环地址,访问自己电脑上的程序。

(二)查看IP地址的方法

方法一

cmd---->ipconfig/all

方法二

(三)端口

我们通过了ip地址找到了具体的某一台电脑,那我们怎么找到了想访问的应用呢?

例如两台QQ进行聊天案例,怎样找到另外一台电脑上的QQ程序呢?就需要通过电脑上的端口了。

命令:cmd---->>>netstat -an

注意:

(1)电脑上的每一个应用程序想运行必须占一个端口号。并且端口号同时间只能被一个应用程序占用。

(2)每一台电脑上一共有65536个端口,端口的范围是0~65535。

(3)一般0~1023被一些其他应用已经占用,因此我们一般从1024开始指定端口。

(四)网络协议(TCP/IP协议簇)

网络协议就是为了能让计算机网络中进行数据交换而建立的规则、标准;

例如下载软件然后如果不同意协议就不能继续下一步,同样的道理在互联网中,如果不遵循互联网协议就不能访问到资源。

应用层

向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。

FTP(File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。

Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。

DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换,使用端口53。

SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中转,使用端口25。

NFS(Network File System)是网络文件系统,用于网络中不同主机间的文件共享。

HTTP(Hypertext Transfer Protocol)是超文本传输协议,用于实现互联网中的WWW服务,使用端口80

传输层

提供应用程序间的通信。

传输控制协议TCP(Transmission Control Protocol),面向连接的可靠的协议。

三次握手

第一次握手:客户端让服务器准备好资源

第二次握手:服务端资源资源准备好了并且服务端问客户端资源有没有准备好

第三次握手:客户端资源也准备好了,接下来才真正的发送数据

三次握手的时候发送的是值

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

数据传输:每传递一次消息,服务端都会告诉客户端说收到消息了。这样确保数据不会丢失。因此我们说TCP是可靠地面向连接(连接一直连着)的传输协议

四次挥手

客户端给服务器说再见,服务器给客户端说拜拜,服务端告诉客户端我也不和你玩了,客户端说不玩就不玩。

第一次,客户端告诉服务端我不会给你发数据了,第二次服务端告诉客户端我收到你发生的信息了,第三次服务端给客户端发生数据说我也不给你发了,第四次客户端给服务端说我知道了。

用户数据报协议UDP(User Datagram protocol),面向无连接的不可靠的协议。

面向无连接,数据不安全,速度快,不可靠,数据有可能丢失。不区分客户端与服务端。

用于网络电话,在线视频网络会议等等,要求实时性比较高(数据传输快)不能有延迟。

当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。

当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

因此UDP是不可靠无连接的协议。因为有可能数据会丢失。

网络层

负责相邻计算机之间的通信。

IP(Internet Protocol)协议,IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。

ICMP(Internet Control Message Protocol)控制报文协议,ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。

Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试

数据链路层

数据链路层是负责接收IP数据包并通过网络发送,或者从网络上接收物理,抽出IP数据包,交给IP层。

ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址

RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站还有DHCP服务

例如 应用层指的是QQ通信需要有自己的协议,迅雷下载下载东西有自己的协议,浏览器访问互联网 使用的是HTTP协议。

例如现在发送一个‘hello’走的过程是:

在应用层加上自己的协议 例如 xx hello。

传递到了传输层,添加了源端口和目的端口。

走到了网络层,会在前面添加上 源ip地址和目的ip。

走到链路层,添加源mac 地址和目的mac地址。

然后通过网线传输到对方的电脑上,先判断是不是我的mac地址,

如果是就减去mac,在往上到网络层,判断是不是我的ip地址,

如果是就减去,依次往上走,直到qq。中间如果有一层不对就把数据扔掉。

对方就不能获取发送过来的信息。

(五)OSI模型

应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

物理层:提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位                 流以及故障检测指示。
数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控。
网络层:控制分组传送系统的操作、路由选择、用户控制、网络互连等功能,它的作用是将具体的物理传送对高层透明。
传输层:提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系统之间提供可靠的透明的数据传送,提供                 端到端的错误恢复和流量控制。
会话层:提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交                     互、两路交替和两路同时会话模式 。
表示层:代表应用进程协商数据表示;完成数据转换、格式化和文本压缩。
应用层:提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等。

四、Socket

(一)概念

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,让Socket去组织数据,以符合指定的协议。

(二)分类

套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

基于文件

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

(三)socket参数详解

(四)基于TCP协议的Socket使用

Socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。

应用:聊天

服务器端的代码

import socket
server_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port=('127.0.0.1',8888)
server_sk.bind(ip_port)
server_sk.listen(128)
new_socket,addr=server_sk.accept()
while True:
    content=new_socket.recv(1024).decode('utf-8')
    print('我是服务端,客户端发来喜电---->',content)
    if content=='拜拜了您嘞':
        break
    msg=input('S---->>>').encode('utf-8')
    new_socket.send(msg)
    if msg=='拜拜了您嘞':
        break
new_socket.close()
server_sk.close()

客户端代码

import socket
client_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port=('127.0.0.1',8888)
client_sk.connect(ip_port)
while True:
    msg=input('C---->>>')
    client_sk.send(msg.encode('utf-8'))
    if msg=='拜拜了您嘞':
        break
    ret=client_sk.recv(1024).decode('utf-8')
    print('我是客户端,服务端发来贺电--->',ret)
    if ret=='拜拜了您嘞':
        break
client_sk.close()

结果 

(五)基于UDP协议的Socket使用

udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接

应用:聊天

服务器端的代码

import socket
sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8888))
while True:
    content,addr=sk.recvfrom(1024)
    print('您有新消息:',content.decode('utf-8'))
    if content.decode('utf-8')=='bye':
        break
    msg=input('请输入内容:')
    sk.sendto(msg.encode('utf-8'),addr)
    if msg=='bye':
        break
sk.close()

客户端代码

import socket
#1.创建socket
client_sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.发送内容
while True:
    msg=input('请输入内容:')
    client_sk.sendto(msg.encode('utf-8'),('127.0.0.1',8888))
    if msg=='bye':
        break
    content,addr=client_sk.recvfrom(1024)
    print('您有新消息:',content.decode('utf-8'))
    if content.decode('utf-8')=='bye':
        break
#3.关闭
client_sk.close()

结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值