网络编程

网络的链接使用:我们学习编程就是为了可以进行相互间的数据信息交流,而要进行远距离的交流这就需要链接网络

链接网络的话我们要知道什么是互联网?

         其实互联网就是一堆协议来规范标准,从而达到相互间的交流

         1.物理层   发送二进制格式(电信号的高低电压)

2.数据链路层  

a.给二进制信号赋予意义  

b.以太网协议(ethernet) : 数据包或数据帧(head:18字节) 和data:46-1500字节)    c. mac(计算机)唯一标识

3.网络层 

a. ip协议:网络部分是找到目标局域网 和 主机部分找到目标计算机

4.传输层  TCP/UDP  port端口号 用于识别应用程序

5.会话层

6.表达层

7.应用层

通常我们把会话层,表达层和应用层合并. 在传输层和应用层之间我们有一个套接字即socket来编程

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

         TCP服务端

import socket
server=socket.socket()
server.bind(('127.0.0.1',9333))
server.listen(10)
while True:
    c,addr=server.accept()
    while True:
        data=c.recv(1024).decode('utf-8')
        print(data)
        if not data:
            c.close()
            break
        c.send(data.upper().encode('utf-8'))
server.close()

         TCP客服端

import socket
c=socket.socket()
c.connect(('127.0.0.1',9333))
while True:
    msg=input('>>>: ')
    if not msg:
        break

    c.send(msg.encode('utf-8'))
    data = c.recv(1024).decode('utf-8')
    print(data)
c.close()

什么是粘包?

       指接收数据是不知道要从哪开始到哪结束.

粘包发生的情况?

         发送端需要等缓冲区满才发送出去,造成粘包

         接收端不及时接收缓冲区的包,造成粘包

解决粘包?

使用报头即先把要接收的长度告知对方(可用struct模块 )

原文地址:https://www.cnblogs.com/zhouhai007/p/9911053.html