python之网络编程

软件开发的架构

c/s架构

C/S即:客户端与服务器端架构
客户端是指用户需要在自己的电脑上安装应用程序指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

b/s架

B/S即浏览器端与服务器端架构,这种架构是从用户层面来划分的。
Browser浏览器,其实也是一种Client客户端,用户只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行操作。

不同计算机上的程序进行通信

类比你收快递,寄快递的那一方首先需要知道你的地址,姓名。而中间的过程就是快递公司干的事,收快递计算机上的一个程序和另外一台计算机上的应用进行通信,需要知道对方电脑的IP和那个应用程序对应的端口。ip对应的是一个一台电脑的地址,端口就对应是哪一个程序。

计算机的通信方式

引出大招socket
不同计算机的两个程序其实是一种双向的通信连接实现数据的交换,它们之间进行通信需要有一个桥梁,不然鬼知道怎么实现计算机之间的数据交换。
就像你收发快递,没有快递公司,你是寄不出快递的,你也不会从快递小哥那收到快递。
计算机之间实现通信的桥梁就是SOCKET,俗称 套接字 他是用ip和端口号组成,ip代表的计算机的地址,而端口号代表的就是一个应用程序,有了 IP和端口号就知道是和哪台计算机进行通信,是要使用哪一个软件。
简单点理解就是:两个程序通过网络进行交互数据,而通信的桥梁是socket,它只负责两件事:建立连接,进而传递数据。

TCP特点(传输控制协议):
1)数据可靠传输
2)面向连接:通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。
3)TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。
优点
TCP用于传输数据量大,可靠性要求高的应用。

UDP(用户数据报协议,User Data Protocol)

  1. 面向非连接(通信之前不需要建立连接,不管对方状态就直接发送
    2)UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。
  2. UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
    与tcp相比,udp不能提供可靠性、流控、差错恢复功能。
    而udp传输数据的不可靠的原因是在以它没有数据进行打包,就像你用快递寄一个笔记本电脑,如果没有对对它加空气泡之类的保护,那么到地方结果不用想,倒吸一口凉气。

总结:
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

tcp的工作流程

服务端工作流程:
服务器端先初始化Socket -->ip,端口绑定(bind)—>对端口进行监听(listen)---->调用accept阻塞,等待客户端连接。在这时如果这时候有客户端发送过来的消息–>连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后请求连接先关闭,最后关闭socket。

一段代码说明一切

import socket
# 基于ipv4的tcp协议  
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP加端口,  
s.bind(('127.0.0.1',8002))
# 监听  
s.listen(5)

conn,addr = s.accept()

msg= conn.recv(1024)
print("从客户端发来的消息",msg)
conn.send(msg.upper())

#发送消息
conn.send(msg)


conn.close()
s.close()

客户端

import socket
s1 = socket.socket()#默认不写的话就是tcp传输,然后使用的是ipv4
#相当于拨电话
s1.connect(('127.0.0.1',8002))
# 发给服务端的msg
s1.send("hello".encode("utf-8"))
#接受服务器端发的数据
data = s1.recv(1024)
print("从服务端收到的数据",data)

注意socket的通信是基于字节码的形式进行通信的,所以需要指定编码形式。当发送的消息的时候需要编码,接受消息的时候解码。

udp

服务端
from socket import *
#数据包似的套接字
ip_port =  ('127.0.0.1',9010,)
udp_server = socket(AF_INET,SOCK_DGRAM)

udp_server.bind(ip_port)

while True:
    msg,addr = udp_server.recvfrom(1024)
    print(msg,addr)
    udp_server.sendto(msg.upper(),addr)
udp_server.close()

客户端

from socket import *
ip = ('127.0.0.1',9010)
udp_cli = socket(AF_INET,SOCK_DGRAM)

while True:
    #发包的时候需要制定发hah送到你那个端口
    msg = input('>>').strip()
    data = udp_cli.sendto(msg.encode('utf-8'),ip)
    back_msg,addr = udp_cli.recvfrom(1024)
    print(back_msg.decode('utf-8'),addr)

创建连接使用到的协议内容

地址簇
    socket.AF_INET IPv4(默认)
    socket.AF_INET6 IPv6
类型
    socket.SOCK_STREAM  流式socket , for TCP (默认)
    socket.SOCK_DGRAM   数据报式socket , for UDP
当未指定内容的时候,他默认使用的是ipv4 传输类型tcp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值