美文网首页
TCP Socket低层次网络编程和UDP Socket低层次网

TCP Socket低层次网络编程和UDP Socket低层次网

作者: wangyu2488 | 来源:发表于2019-12-22 14:39 被阅读0次

    2019年12月12日

    TCP/IP协议的传输层又有两种传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP是面向连接的可靠数据传输协议。

    一.TCP Socket低层次网络编程

    TCP就像好比电话,电话接通后双方才能通话,在挂断电话之前,电话一直占线。

    image.png

    1.简单聊天工具
    1.1服务器端代码

    # coding=utf-8
    
    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', 8888))
    s.listen()
    print('服务器启动...')
    
    # 等待客户端连接
    conn, address = s.accept()
    # 客户端连接成功
    print(address)
    
    # 从客户端接收数据
    data = conn.recv(1024)
    print('从客户端接收消息:{0}'.format(data.decode()))
    # 给客户端发送数据
    conn.send('你好'.encode())  # conn.send(b'你好')
    
    # 释放资源
    conn.close()
    s.close()
    

    1.2客户端代码

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    s.connect(('127.0.0.1', 8888))
    
    # 给服务器端发送数据
    s.send(b'Hello')
    # 从服务器端接收数据
    data = s.recv(1024)
    print('从服务器端接收消息:{0}'.format(data.decode()))
    
    # 释放资源
    s.close()
    

    1.3测试先启动服务器端代码

    image.png image.png

    2.文件上传工具

    2.1服务器端

    import socket
    
    HOST = ''
    PORT = 8888
    
    f_name = 'coco2dxcplus_copy.jpg'
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen(10)
        print('服务器启动...')
    
        while True:
            with s.accept()[0] as conn:
                # 创建字节序列对象列表,作为接收数据的缓冲区
                buffer = []
                while True:  # 反复接收数据
                    data = conn.recv(1024)
                    if data:
                        # 接收的数据添加到缓冲区
                        buffer.append(data)
                    else:
                        # 没有接收到数据则退出
                        break
                # 将接收的字节序列对象列表合并为一个字节序列对象
                b = bytes().join(buffer)
                with open(f_name, 'wb') as f:
                    f.write(b)
    
                print('服务器接收完成。')
    

    2.2客户端

    import socket
    
    HOST = '127.0.0.1'
    PORT = 8888
    f_name = 'coco2dxcplus.jpg'
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        with open(f_name, 'rb') as f:
            b = f.read()
            s.sendall(b)
            print('客户端上传数据完成。')
    

    2.3印证 先开服务器

    image.png image.png

    二.UDP Socket低层次网络编程

    UDP(用户数据报协议)就像日常生活中的邮件投递,是不能保证可靠的寄到目的地.UDP是无连接的,对系统资源的要求较少.UDP可能丢包不保证数据顺序。但是对于网络游戏和在线视频等要求传输快、实时性高,质量可稍差一点的数据传输,UDP还是非常不错的。(优点不会一直占线)

    1.简单聊天工具

    1.1服务器

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(('', 8888))
    print('服务器启动...')
    
    # 从客户端接收数据
    data, client_address = s.recvfrom(1024)
    print('从客户端接收消息:{0}'.format(data.decode()))
    # 给客户端发送数据
    s.sendto('你好'.encode(), client_address)  # 如果数据量很大会多次调用
    
    # 释放资源
    s.close()
    

    1.2客户端

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 服务器地址
    server_address = ('127.0.0.1', 8888)
    
    # 给服务器端发送数据
    s.sendto(b'Hello', server_address)
    # 从服务器端接收数据
    data, _ = s.recvfrom(1024)
    print('从服务器端接收消息:{0}'.format(data.decode()))
    
    # 释放资源
    s.close()
    

    1.3测试

    image.png image.png

    2.文件上传工具 上传图片容易丢失,用文件替代

    2.1服务器

    import socket
    
    HOST = '127.0.0.1'
    PORT = 8888
    
    f_name = 'test_copy.txt'
    
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.bind((HOST, PORT))
        print('服务器启动...')
    
        # 创建字节序列对象列表,作为接收数据的缓冲区
        buffer = []
        while True:  # 反复接收数据
            data, _ = s.recvfrom(1024)
            if data:
                flag = data.decode()
                if flag == 'bye':  # 和客户端约定好的结束符号
                    break
                buffer.append(data)
            else:
                # 没有接收到数据,进入下次循环继续接收
                continue
        # 将接收的字节序列对象列表合并为一个字节序列对象
        b = bytes().join(buffer)
        with open(f_name, 'w') as f:
            f.write(b.decode())
    
        print('服务器接收完成。')
    

    2.2客户端

    import socket
    
    HOST = '127.0.0.1'
    PORT = 8888
    
    f_name = 'test.txt'
    
    # 服务器地址
    server_address = (HOST, PORT)
    
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        with open(f_name, 'r') as f:
            while True:  # 反复从文件中读取数据
                data = f.read(1024)
                if data:
                    # 发送数据
                    s.sendto(data.encode(), server_address)
                else:
                    # 发送结束标志
                    s.sendto(b'bye', server_address)
                    # 文件中没有可读取的数据则退出
                    break
    
            print('客户端上传数据完成。')
    

    2.3测试

    image.png image.png

    如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。

    相关文章

      网友评论

          本文标题:TCP Socket低层次网络编程和UDP Socket低层次网

          本文链接:https://www.haomeiwen.com/subject/zyeonctx.html