python网络编程

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

二、 网络编程
就是通过网络让不同计算机上运行的程序可以进行通信。
例如两台电脑上的qq通过网络进行相互聊天。

三、 软件开发架构
两个程序之间通讯的应用大致可以分为两种:
第一种是应用类程序:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用
第二种是web类程序:用户只需要浏览器即可访问程序。常见的web类应用程序比如百度、知乎、CSDN等使用浏览器访问就可以直接使用。
不管是应用类程序还是web类程序,这些应用的本质其实都是两个程序之间的通讯。
而这两个分类又对应了两个软件开发的架构。
1、客户端服务端概念
客户端:就是我们常用的程序例如qq、微信,浏览器等等。
服务端:要一直运行着给别人提供服务的机器(电脑、服务器)。
2、C/S架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构。
这里的客户端一般泛指客户端应用程序exe,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。
在这里插入图片描述
3、B/S架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构。
只需在浏览器上通过HTTP(协议)去请求服务器端相关的资源(网页资源)。
在这里插入图片描述
四、 计算机网络
1、每台电脑在网络世界中都有一个全球唯一的标识就是ip地址。
那ip地址是什么呢?我们的电脑上网需要有硬件设施、网线和网卡;网卡用来链接网线。网卡上有全球上唯一的物理地址(mac),长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号),查看方法:window系统中按win(左下角的田字按键)+R——>输入cmd进入命令行——>输入ipconfig/all敲回车即可
链接mac地址记起来很麻烦因此出现了ip地址。范围0.0.0.0-255.255.255.255。
一个ip地址通常写成四段十进制数,例:172.16.10.1
通过 ip地址 就能找到mac地址,中间遵循了ARP(Address Resolution Protocol)协议,
中文叫:地址解析协议, 是根据IP地址获取物理地址的一个TCP/IP协议。
2、我们通过了ip地址找到了具体的某一台电脑,那我们怎么找到了想访问的应用呢?例如两台
QQ进行聊天案例,怎样找到另外一台电脑上的QQ程序呢?就需要通过电脑上的端口了。

电脑上的每一个应用程序想运行必须占一个端口号。并且端口号同时间只能被一个应用程序占用。
每一台电脑上一共有65536个端口,端口的范围是0-65536,一般0~1023被一些其他应用已经占用,因此我们一般从1024开始指定端口。
五、网络协议(TCP/IP协议族)
网络协议就是为了能让计算机网络中进行数据交换而建立的规则、标准;
例如下载软件然后如果不同意协议就不能继续下一步,同样的道理在互联网中,如果不遵循互联网协议就不能访问到资源;
互联网上有上百种协议,但是最重要的两个协议是TCP协议和IP协议,因此我们将上百种协议统称为TCP/IP 协议族。TCP/IP协议族,根据协议的功能的不同抽象成了4层。
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
在这里插入图片描述
数据传输的时候先将数据从应用层传递到传输层,然后再从传输层传递到网络层,然后再传递到链路层,最后在通过物理传输介质(网线)传递数据。
例如现在发送一个‘hello’走的过程是:
在应用层加上自己的协议 例如 xx hello。
传递到了传输层,添加了源端口和目的端口。
走到了网络层,会在前面添加上 源ip地址和目的ip。
走到链路层,添加源mac 地址和目的mac地址。
然后通过网线传输到对方的电脑上,先判断是不是我的mac地址,如果是就减去mac,在往上到网络层,判断是不是我的ip地址,如果是就减去,依次往上走,直到qq。中间如果有一层不对就把数据扔掉。对方就不能获取发送过来的信息。
1、 TCP协议
TCP(Transmission Control Protocol)可靠的、面向连接的协议
TCP协议特点:数据安全,速度略低。分为客户端和服务端。
使用TCP的应用:Web浏览器;电子邮件等程序。
TCP的三次握手和四次挥手:
TCP三次握手就是:客户端和服务器进行通信的时候有三次交流,这就是面向链接
第一次握手:是客户端让服务器准备好资源。
第二次握手:服务端资源准备好了并且服务端问客户端资源有没有准备好。
第三次握手:客户端资源也准备好了;真正进行三次握手的时候发送的是值。
TGP四次挥手就是:客户端给服务器说再见,服务器给客户端说拜拜,服务端告诉客户端我也不和你玩了,客户端说不玩就不玩。正经一点说就是
第一次,客户端告诉服务端我不会给你发数据了。
第二次服务端告诉客户端我收到你发生的信息了。
第三次服务端给客户端发生数据说我也不给你发了。
第四次客户端给服务端说我知道了。
2、 UDP协议
UDP协议:面向无连接,数据不安全,速度快。不区分客户端与服务端。
用于网络电话,在线视频网络会议等等,要求实时性比较高(数据传输快)不能有延迟。
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
因此UDP是不可靠无连接的协议。因为有可能数据会丢失。
3、 TCP和UDP的对比
TCP–提供的是面向连接、可靠的服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP–是一个简单的不可靠的运输层协议。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
4、 OSI模型
OSI模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型
OSI模型又将TCP/IP协议族的四层进行了具体划分,划分成了7层。

五、Socket概念
1理解Socket

首先我们写的网络编程,属于应用层,当我们写好了程序后,需要将数据发送给运输层,
但是应用层和运输层通信需要遵循相关协议,关键是我们不了解运输层的协议,那该怎么办呢?因此提供了Socket层,Socket英文插座,插口,套接口字意思。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,他把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,让Socket去组织数据,以符合指定的协议。(面向对象特点,我们负责编写逻辑即可,不用去管TCP/IP具体格式,Socket会帮我们做)。

2、Scoket发展史
套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,有时候人们也把套接字称为“伯克利套接字”或者“BSD套接字”。一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯。这也被称进程通讯,或IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

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

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

3、socket参数详解
socket.socket(family=AF_INET,type=SOCK_STREAM)
family:地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_RDS。
(AF_UNIX域实际上是是用本地socket文件来通信)
type :套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或者其他SOCK_常量之一。
SOCK_STREAM是基于TCP的,有保障的(即能保证数据正确传送到对方)面向链接的SOCKET,多用于资料传送。
SOCK_DGRAM是基于UDP的,无保障的面向消息的socket,多用于在网络商法广播信息。

4、基于TCP协议的socket使用
socket是基于tcp协议的,tcp是基于链接的,因此在通讯开始之前,一定要先建立相关的链接,才能发送数据。必须先启动服务端,然后再启动客户端去链接服务端。
5、基于udp协议的socket使用
udp是无链接的,启动之后可以直接接受消息,不需要提前建立链接

了解了网络编程大部分基础,现在练习做一个客户端和服务器互相聊天加深理解
TCP版
服务端:
**注意:**要先运行服务端再运行客户端,否则控制台会报错(由于目标计算机积极拒绝,无法连接。)需要先建立链接,服务器不开,客户端找不到。

import socket #调用socket模块

server_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字
in_port=('10.10.65.120',9999)#设置IP地址 端口号,这是一个元组类型
server_sk.bind(in_port)#绑定ip地址和端口号
server_sk.listen(128)#表示并发量

new_socket,addr=server_sk.accept()#等待客户端的链接
#socket负责和客户端进行收发数据,第二个数据是客户端的地址和端口

while True:#创建无限循环
    ret=new_socket.recv(1024)#接受客户端发来的消息
    ret=ret.decode('utf-8')#将发来的消息进项转码
    print('客户端发来消息:',ret)#打印客户端发的内容

    ret1=input('输入要对客户端说的话:')
    new_socket.send((ret1.encode('utf-8')))#向客户端发送消息并且转码

new_socket.close()#下线
server_sk.close()#退出

客户端:

import socket

client_sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 和客户端进行链接
client_sk.connect(('10.10.65.120',9999))

while True:
    ret=input('请输入要对服务器说的话:') # 给服务端发生数据,数据是字节类型
    client_sk.send(ret.encode('utf-8'))#向服务器发送信息并转码


    ret1=client_sk.recv(1024).decode('utf-8')#接受服务器信息并转码
    print('服务器发来信息:',ret1)


client_sk.close()# 关闭链接

UDP版
UDP是一个简单的不可靠的运输层协议,所以不用先运行TCP建立链接
服务器:

import socket#调用socket模块

udp_sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#创建套接字
udp_sk.bind(('10.10.65.120',9999))#绑定ip地址,端口号
while True:#创建循环
    msg,addr=udp_sk.recvfrom(1024)
    print(msg.decode('utf-8'))

    info=input('想对客户端说啥:').encode('utf-8')
    udp_sk.sendto(info,addr)

udp_sk.close()

客户端:

import socket
udp_sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
in_port=(('10.10.65.120',9999))
while True:
    msg=input('相对服务器说什么:')
    udp_sk.sendto(msg.encode('utf-8'),in_port)

    ret,addr=udp_sk.recvfrom(1024)
    print('服务器发来信息:',ret.decode('utf-8'))

upd_sk.close()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值