zoukankan      html  css  js  c++  java
  • python 网络编程--socket模块/struct模块

    socket模块:

    客户端:CS架构,  client -> server

    浏览器:BS架构,  browser -> server

    网络通信本质:传输字节

    doc命令查看ip地址:ipconfig / ifconfig(windows系统 / mac系统)

    tcp协议和udp协议

    TCP(Transmission Conteol Protocol)可靠的,面向连接的协议(eg打电话),传输效率低全双工通信(发送缓存&接收缓存),面向字节流.使用TCP的应用:Web浏览器;电子邮件,文件传输程序.

    UDP(User Datagram Protocol)不可靠的,无连接的服务,传输效率高(发送前延时小),一对一,一对多,多对一,多对多,面向报文,尽最大努力服务,无拥塞控制.使用UDP的应用:域名系统(DNS);视频流;IP语音(VoIP).

    服务端:

    import socket
    
    # 创建服务端socket对象 server
    = socket.socket()

    # 绑定IP和端口 server.bind((
    '192.168.13.88',5001))

    # 后边可以等5个人 server.listen(
    5) while 1:
    conn,addr
    = server.accept() # 等待客户端来连接,如果没人来就傻傻的等待。
    #字节类型 while 1: data = conn.recv(1024) # 一次性最多拿1024字节。 if data == b"exit": break response = data + b'在北京' conn.send(response) # 服务端通过连接对象给客户端回复了一个消息。 conn.close() # 与客户端断开连接

    客户端:

    import socket
    
    # 创建服务端socket对象 sk
    = socket.socket()
    # 绑定IP和端口 sk.connect((
    '192.168.13.88',5001)) while 1: name = input('请输入姓名:') sk.send(name.encode('utf-8')) # 链接上服务端后,向服务端发送消息 if name == 'exit': break response = sk.recv(1024) # 等待服务端给他发送消息 print(response.decode('utf-8')) sk.close() # 关闭自己

     黏包:

    同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到了之前执行的另外一部分结果,这种显现就是黏包.

    #_*_coding:utf-8_*_
    from socket import *
    import subprocess
    
    ip_port=('127.0.0.1',8888)
    BUFSIZE=1024
    
    tcp_socket_server=socket(AF_INET,SOCK_STREAM)
    tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    tcp_socket_server.bind(ip_port)
    tcp_socket_server.listen(5)
    
    while True:
        conn,addr=tcp_socket_server.accept()
        print('客户端',addr)
    
        while True:
            cmd=conn.recv(BUFSIZE)
            if len(cmd) == 0:break
    
            res=subprocess.Popen(cmd.decode('utf-8'),shell=True,
                             stdout=subprocess.PIPE,
                             stdin=subprocess.PIPE,
                             stderr=subprocess.PIPE)
    
            stderr=res.stderr.read()
            stdout=res.stdout.read()
            conn.send(stderr)
            conn.send(stdout)
    
    tcp - server
    黏包实例:TCP/服务端
    #_*_coding:utf-8_*_
    import socket
    BUFSIZE=1024
    ip_port=('127.0.0.1',8888)
    
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    res=s.connect_ex(ip_port)
    
    while True:
        msg=input('>>: ').strip()
        if len(msg) == 0:continue
        if msg == 'quit':break
    
        s.send(msg.encode('utf-8'))
        act_res=s.recv(BUFSIZE)
    
        print(act_res.decode('utf-8'),end='')
    
    tcp - client
    黏包实例:TCP/客户端

    tcp协议的拆包机制

    成因:当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发出去.MTU是Maximum Transmission Unit的缩写.意思是网络上传的最大数据包.MTU的单位是字节.大部分网络设备的MTU都是1500.如果本季的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度.

     struct模块:

    该模块可以把一个类型,例如数字,转换成固定长度的bytes

    struct.pack('i',1111111111111)
    
    struct.error: 'i' format requires -2147483648 <= number <= 2147483647 #这个是范围
  • 相关阅读:
    [技术][RIA]<<Silverlight2完美征程>> 李会军
    HTML5+CSS3 W3C规范<<中文版>>参考手册(提供下载)
    爱情四十五课,别唱独角戏
    爱情四十八课,深情淡如水
    爱情四十九课,畸恋小变态
    爱情四十三课,热战与冷战
    背完这444句,你的口语绝对不成问题了
    [沟通][两性]<<为什么男人爱说谎女人爱哭 (Why men lie and wowen cry)>>艾伦皮斯.芭芭拉皮斯(美)
    做网站用UTF8还是GB2312?
    查询ORACLE表的约束
  • 原文地址:https://www.cnblogs.com/zbw582922417/p/9578978.html
Copyright © 2011-2022 走看看