网络编程知识点小结

网络编程知识点回顾

一、协议

1.c/s和b/s架构

c/s:客户端和服务器

b/s:浏览器和服务器,本质上还是客户端和服务器

2.osi五层

  • 物理层:高低压电信号
  • 数据链路层:数据报、mac地址
  • 网络层:IP协议和端口号(IP可以通过arp协议,和mac地址进行转换)
  • 传输层:TCP和UDP协议

TCP:基于数据流的可靠协议(三次握手、四次挥手)

UDP:基于数据报的不可靠协议

  • 应用层:http协议,邮件协议等

二、 socket

在传输层和应用层之间的一层抽象层,可以操作网络层和传输层

1.用套接字实现tcp协议的通信

2.用套接字实现的UDP协议的通信

3.发生粘包的两种情况

  • 发送端需要等缓冲区满才发送出去,造成粘包(发送时间间隔很短,数据又很小,会合到一起,产生粘包)
  • 接收端不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次手的时候还是从缓冲区呐上次一流的数据,产生粘包)

4.解决粘包的问题

  • 为字节流加上固定的报头,报头中含有字节流的长度,一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。

    struct()模块,将数据长度打包为四个int型的字节

  • 把报头做成字典,字典里面包含将要发送的真实数据的信息,,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节,一同send到对端

    发送时:
    先发报头长度
    再编码报头内容然后发送
    最后发真实内容
    
    
    接收时:
    先手报头长度,用struct取出来
    根据取出的长度收取报头内容,然后解码,反序列化
    从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容
    

5.UDP协议

  • 用udp实现简单通信

    #服务器
    import socket
    soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #socket.SOCK_DGRAM是UDP协议
    soc.bind(('127.0.0.1',8080))   #绑定地址和端口号
    while True:  #通信循环
        data,addr = soc.recvfrom(1024)  #无需等待接收和监听
        print(data)
        soc.sendto(data.upper(),addr)  #将处理好的数据发送给客户端
    #客户端
    import socket
    soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #实例化一个对象
    while True: #通信循环
        msg= input('请输入数据>>>').strip()
        msg = msg.encode('utf8')  #将数据转化为bytes格式
        soc.sendto(msg,('127.0.0.1',8080))
        data = soc.recvfrom(1024)   #接收数据
        print(data[0]) #打印数
  • udp的特点:

    可以发送空内容

    不需要建立连接

    客户端和服务端谁断开都不影响发送

    不会粘包

6.socketserver模块

1) socketserver模块实现TCP简单通信

服务端

* 导入模块
* 定义一个类
* 类中必须重新handle方法
* handle里面写一些简单的逻辑
* `if __name__ == '__main__':`
* 实例化一个socketserver对象:`soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)`
* `soc.serve_forever() `

客户端:用socket模块就行

2)socketserver模块实现UDP简单通信

书写步骤同上

转载于:https://www.cnblogs.com/zhuangyl23/p/11508439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值