zoukankan      html  css  js  c++  java
  • 网络编程

    一.客户端/服务器架构

    UDP架构:

    import socket
    #创建一个udp协议下的socket,需要使用参数type
    udp_server = socket.socket(type=socket.SOCK_DGRAM) #DGRAM : datagram  数据报
    #拿到一个地址,启动程序的时候,告诉电脑,你给我这个程序分配8001端口.
    ip_port = ('192.168.15.113',8001)
    #绑定IP地址和端口
    udp_server.bind(ip_port)
    
    print('准备接收消息了...')
    #接收消息,from_client_msg来自客户端的消息,client_addr客户端的地址('192.168.15.113', 8001)
    from_client_msg,client_addr = udp_server.recvfrom(1024)  #阻塞住了
    print(11111)
    print(from_client_msg)
    print(client_addr)
    #发送消息
    udp_server.sendto(b'gunduzi',client_addr)
    #关闭udp的socket对象
    udp_server.close()
    服务端
    import socket
    udp_client = socket.socket(type=socket.SOCK_DGRAM)
    server_ip_port = ('192.168.15.113',8001)
    
    udp_client.sendto(b'hello',server_ip_port)
    
    from_server_msg,server_addr = udp_client.recvfrom(1024)
    print(from_server_msg)
    print(server_addr)
    
    udp_client.close()
    客户端

    TCP架构:

    import socket
    
    # 创建服务端socket对象
    server = socket.socket()
    
    
    # 绑定IP和端口
    server.bind(('192.168.13.100',8000))
    
    # 后边可以等5个人
    server.listen(5)
    
    print('服务端准备开始接收客户端的连接...')
    # 等待客户端来连接,如果没人连接就一直等待
    # conn是客户端与服务端连接的对象,服务端以后要通过该对象进行收发数据
    # addr是客户端的地址信息
    # 阻塞,只有客户端进行连接,则获取客户端连接然后开始进行通信
    conn,addr = server.accept()
    
    print('已经有人连接上了,客户端信息:',addr)
    
    # 通过对象去获取(客户端发送的消息)
    # 1024表示:服务端获取数据时,一次最多拿1024字节
    data = conn.recv(1024)
    print('收到消息:',data.decode('utf-8'))
    
    
    # 服务端通过连接对象给客户端恢复一个消息
    conn.send('赛利亚!你好,我是凯丽'.encode('utf-8'))
    
    # 与客户端断开连接
    conn.close()
    
    # 关闭服务端的服务
    server.close()
    服务端
    import socket
    
    client = socket.socket()
    
    # 客户端向服务端发起连接请求
    # 阻塞,去连接,直到连接成功才会继续向下执行
    client.connect(('192.168.13.100',8000))
    
    # 连接上服务端后,向服务端发送消息
    client.send('你好啊,我是赛利亚...'.encode('utf-8'))
    
    
    # 等待服务端回复消息
    data = client.recv(1024)
    print(data.decode('utf-8'))
    
    # 关闭自己(客户端)
    client.close()
    客户端

    服务端套接字函数

    s.bind() 绑定(主机,端口号)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

    客户端套接字函数
    s.connect() 主动初始化TCP服务器连接
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

    公共用途的套接字函数
    s.recv() 接收TCP数据
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字

    面向锁的套接字方法
    s.setblocking() 设置套接字的阻塞与非阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间

    面向文件的套接字的函数
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字相关的文件

    二.OSI7层模型

    三、简述 三次握手、四次挥手的流程

    #三次握手:
       1.客户端(Client)向服务端(Server)发送一次请求
       2.服务端确认并回复客户端
       3.客户端检验确认请求,建立连接
    #四次挥手:
       1.客户端向服务端发一次请求
       2.服务端回复客户端(断开客户端-->服务端)
       3.服务端再次向客户端发请求(告诉客户端可以断开了)
       4.客户端确认请求,连接断开

    四、线程

    import  time
    import threading
    
    def task(a,b,c):
        time.sleep(3)
        print('佩奇拿快递去')
    
    def play():
        time.sleep(4)
        print('陪佩奇女友出去玩')
    
    def ktv():
        time.sleep(5)
        print('陪alex女友唱歌去')
    
    
    # 创建一个线程
    # 让该线程去执行任务(函数)
    n1 = threading.Thread(target=task,args=(1,2,3,))
    # 开始执行
    n1.start()
    
    # 创建一个线程
    # 让该线程去执行任务(函数)
    n1 = threading.Thread(target=play)
    # 开始执行
    n1.start()
    
    
    # 创建一个线程
    # 让该线程去执行任务(函数)
    n1 = threading.Thread(target=ktv)
    # 开始执行
    n1.start()
    
    # 我坐家里打游戏
    print('开黑,王者荣耀')
    print('吃鸡,四黑有没有')
    print('没有我一会再来')
    初始线程
    import time
    import socket
    import threading
    
    
    def task(conn):
        time.sleep(20)
        data = conn.recv(1024)
        print(data)
        conn.close()
    
    server = socket.socket()
    server.bind(('192.168.13.100',8000,))
    server.listen(5)
    
    while True:
        conn,addr = server.accept()
        n = threading.Thread(target=task,args=(conn,))
        n.start()
    socket和线程配合

    五、进度条

    def func(size,total_size):
        val = int(size/total_size * 100)
        time.sleep(0.05)
        print('
    %s%s%%'%('*'*val,val),end='')
    
    for i in range(101):
        func(i,100)
  • 相关阅读:
    leetcode1161 Maximum Level Sum of a Binary Tree
    leetcode1162 As Far from Land as Possible
    leetcode107 Binary Tree Level Order Traversal II
    leetcode100 Same Tree
    spring常用注解的使用
    内部bean和级联属性的用法
    spring中ref标签的用法
    spring的依赖注入
    spring中的bean标签详解
    spring中BeanFactory和ApplicationContext的区别
  • 原文地址:https://www.cnblogs.com/hmw112626/p/9637513.html
Copyright © 2011-2022 走看看