0

    网络通信,基于套接字socket进行通信

    2023.05.03 | admin | 253次围观

    1.应用层:

    应用层功能:规定应用程序的数据格式。

    例:TCP协议可以为各种各样的程序传递数据缺少网络连接需要的windows套接字,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式缺少网络连接需要的windows套接字,这些应用程序协议就构成了”应用层”。

    2.传输层:

    传输层功能:建立端口到端口的通信

    补充:端口范围0-65535,0-1023为系统占用端口

    tcp协议:

    可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割

    3.osi七层协议

    网络通信,基于套接字socket进行通信

    4.TCP三次握手四次挥手:

    5 基于套接字通信:5.1:tcp协议服务端:

    """
    服务端应该满足的特点:
    1.一直提供服务
    2.并发的提供服务
    """
    import socket
    #1.买手机
    # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议
    phone = socket.socket() #默认是TCP协议
    # 2.绑定手机卡
    # 0.0.0.0 ----> 代表允许任何的ip链接
    phone.bind(("127.0.0.1",8080))   #ip+端口(0-65535)1024以前的都被系统保留使用
    #3.开机  (监听状态)
    phone.listen(5)   #5指的是半连接池大小
    #4.等待电话连接请求:拿到电话连接conn
    #加上链接循环
    while True:
       conn,client_addr = phone.accept() #接受,程序启动后,会在accept这里夯住,阻塞
       print(conn)  #连接对象,三次握手的双向通路
       print("客户端的ip和端口:",client_addr)
       while True:
          try:
             #5.通信:收/发消息
             data = conn.recv(1024)  #最大接受的数据量为1024Bytes,收到的是bytes类型
             if len(data) == 0:
                # 针对unix系统里,一旦data收到为空
                # 意味着是一种异常的行为:客户非法断开链接
                break
             print("客户端发来的消息:",data.decode("utf8"))
             conn.send(data.upper())
          except Exception:
             #针对windows系统
             break
       #6.关闭电话连接comm
       conn.close()
    #7.关机(可选操作)
    # phone.close()

    tcp协议客户端:

    import socket
    #1.买手机       sokcet类      地址家族
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议
    #2.拨通服务端电话
    phone.connect(("127.0.0.1",8080))  #进行3次握手
    while True:
       msg = input("输入要发送的消息:").strip()
       if len(msg) == 0:continue  #解决输入空格的bug
       if msg == "quit":
          break
       # 3.通信
       phone.send(msg.encode("utf8")) #编码以二进制的形式发送
       data = phone.recv(1024)
       print(data.decode("utf8"))    #解码
    #4.关机连接(必选的回收资源的操作)
    phone.close()

    5.2udp协议服务端(用在对实时性要求很高的程序上面)

    import socket
    sever = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #udp协议
    sever.bind(("127.0.0.1",8081))
    while True:
       data,client_addr = sever.recvfrom(1024)
       sever.sendto(data.upper(),client_addr)
    sever.close()

    udp协议客户端

    import socket
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #udp协议
    while True:
       msg = input("输入要发送的消息:").strip()
       client.sendto((msg.encode("utf8")),("127.0.0.1",8081))
       res = client.recvfrom(1024)
       print(res)
    client.close()

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论