网络编程

1 基础了解 网络协议

网络根据地域âï分为三类:局域网()、城域网(几十公里)、广域网(www)

IP地址

IP地址是由4个8位组成,每一个数字不能大于255,
00000000.00000000.00000000.00000000

由网络IP+本机IP组成,分类五类:
A:1.0.0.0~126.255.255.255 (127.0.0.1,localhost是本地回环地址)例:111.2.1.123 网络IP:111.0.0.0 本机IP:0.2.1.123
B:128.0.0.0~191.255.255.255
例:129.23.23.21 网络IP:129.23.0.0 本机IP:0.0.23.21
C:192.0.0.0~223.255.255.255
例:192.123.12.9 网络IP:192.123.12.0 本机IP:0.0.0.9
D:用于组播
E:仅实验和开发用

网络模型

(理论上七层模型,目前5层),亦称OSI:
应用层(表示层、会话层)
传输层:tcp udp
网络层:逻辑寻址,寻路径
数据链路层:硬件寻址
物理层:

理论七层网络模型:
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层

端口

端口号不是随意使用的,而是按照一定的规定进行分配的
端口号的分类有好几种:知名端口好和动态端口号等等

知名端口

知名端口是众所周知的端口号,一般是从0-1023

80端口分配给HTTP服务 默认
21端口分配给FTP服务 默认
443端口分配给HTTPS服务 默认
动态端口
动态端口的范围一般是从1024到65535

之所以称之为动态端口,是因为它一般不固定分配某种服务,而是动态分配。

动态分配是指当一个系统进程或者应用程序进程需要网络通讯时,它想主机申请一个端口,主机从可用的端口号中分配一个供它使用,当这个进程关闭时,同时也就释放了所占用的端口号

通信协议:

tcp:可靠,有状态的,长连接的协议,像打电话一样
udp:不可靠,无连接,像发短信一样。发送的包的顺序要有编号
http:基于tcp的协议,无状态的协议
ftp:文件传输协议
pop3:邮局协议版本3”。是TCP/IP协议族中的一员
smtp:简单邮件传输协议
QQ视频,发消息

2 HTTP TCP协议

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
这里写图片描述
一次HTTP操作称为一个事务,其工作过程可分为四步:

1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了

Python 提供了两个级别访问的网络服务。:
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])
参数
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.

Socket 对象(内建)方法

服务器端套接字
s.bind() 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen() 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来

客户端套接字
s.connect() 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.recv() 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

s.close() 关闭套接字

下面举例:
客户端:

import socket
import threading

clientSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientSocket.connect(("127.0.0.1",8888))
print("客户端已连接")

def myrerv(c):
    print("bbbbbbb")
    while True:
        msg = c.recv(1024)  # 接收消息
        print(msg.decode())
threading._start_new_thread(myrerv,(clientSocket,))
def sendmsg():
    while True:
        msg=input("客户端输入:")
        clientSocket.send(msg.encode("utf-8"))
threading._start_new_thread(sendmsg())

clientSocket.close()

服务端:

import socket
import _thread
#服务器端
serverSocket=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
serverSocket.bind(("127.0.0.1",8888))
print("服务器等待...")
serverSocket.listen(5)
clientSocket,addr=serverSocket.accept()#收客户端的连接,此c是元组,表示得到的客户端的地址和端口

def myrerv(c):
    print("aaaa")   
    while True:
        msg = c.recv(1024)  # 接收消息
        print(msg.decode())
_thread.start_new_thread(myrerv,(clientSocket,))
def sendmsg():
    while True:
        msg=input("服务器端输入:")
        clientSocket.send(msg.encode("utf-8"))
_thread.start_new_thread(sendmsg())
clientSocket.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值