zoukankan      html  css  js  c++  java
  • 网络编程, socket用法

    1、架构

    C/S架构(鼻祖)
    c:client 客户端
    s:server 服务器

    B/S架构(隶属于C/S架构)
    b:browser 浏览器
    s: server 服务器

    B/S架构的优点:统一了应用的入口(是一个趋势)

    =====================网络编程基础====================

    2、同一台电脑上两个py文件通信:文件
    网卡:网卡生产厂商生产的,不是电脑厂商生产的
    网卡上有一个mac地址,又叫做物理地址,全世界唯一
    查看mac地址命令:ipconfig -all


    3、两台电脑如何通信:一根网线


    4、几十台电脑如何通信:局域网
    交换机通信:
    广播:吼一嗓子
    单播:方向固定的向某一个主机发送
    组播:朝某一部分或某一组主机发送

    ip地址:是一个四位点分十进制的一串数字
    子网掩码:是计算机根据你的ip地址生产的一个东西
    网段:ip地址 &(与) 子网掩码

    ip :192.168.12.84

    11000000.10101000.00001100.01010100
    11111111.11111111.11111111.00000000
    -----------------------------------
    11000000.10101000.00001100.00000000
    192.168.12.0


    子网:255.255.255.0


    5、更多电脑之间的通信:
    广域网 交换机+路由器+代理ip

    6、库 == 模块 :别人已经写好的代码,我可以直接拿来调用

    tcp和udp协议都是基于socket模块
    tcp:安全可靠,面向连接,字节流服务--代表没有边界
    udp:不安全不可靠,不面向连接,但是效率高


    7、端口号:
    ip + prot 唯一确定一台主机上的某一个程序
    允许开发人员使用的端口号范围从8000开始 8000-10000

    8、tcp协议的三次握手过程:
    客户端先发:我想请求连接
    服务器发: 同意,我也想连接你
    客户端发: 同意连接

    9、tcp协议的四次挥手过程:
    客户端:我想断开连接
    服务器:行
    服务器:我也想和你断开连接
    客户端:行

    面试题:

    1、你知道哪些研发相关的架构?

        c/s  b/s(统一了应用的接口)

    2、arp协议做了什么事情?

      通过ip地址找到对应的mac地址

    3、交换机的通讯方式?

      广播,单播,组播

    4、你认为tcp和udp的区别?

      tcp:安全,面向连接

      udp:快

    5、请描述出osi五层模型?

      应用层(py文件)----传输层(tcp,udp协议)----网络层(ip协议)----数据链路层(网卡,arp协议)----物理层(网线,集线器,电信号)

    6、网段ip怎么确定?

      ip地址 按位与 子网掩码

    7、请描述B/S架构的优势

       b/s(统一了应用的接口)

    ====================socket====================

    tcp协议,不允许在同一时间点同时和多个客户端连接通信   

    s:server 服务器

    import socket
    sk = socket.socket()                 #创建
    sk.bind(("127.0.0.1",8090))      #绑定
    sk.listen(5)               #监听
    
    while True:
        fd,addr = sk.accept()      # fd 收到的信息  addr 客户端的地址
        while 1:
            msg_s = input(">>>")
            fd.send(msg_s.encode("utf-8"))    # 发送
            if msg_s == "q":
                break
    
            msg_r = fd.recv(1024).decode('utf-8')  #接收
            if msg_r == "q":
                break
            print(msg_r)
        fd.close()
    
    sk.close()

    c:client 客户端

    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8090))    #连接
    
    while True:
        msg_r = sk.recv(1024).decode('utf-8')    #接收
        if msg_r == "q":
            break
        print(msg_r)
    
        msg_s = input(">>>")
        sk.send(msg_s.encode('utf-8'))    #发送
        if msg_s == "q":
            break
    
    
    sk.close()

     

    udp协议,允许在同一个时间点同时和多个客户端连接通信

    s:server 服务器

    import socket
    import random
    
    ls = ["33[1;"+str(i)+"m" for i in range(30,38)] #生成颜色
    print(socket.gethostbyname(socket.gethostname())) #查看本机的ip地址
    sk
    = socket.socket(type=socket.SOCK_DGRAM) # SOCK_DGRAM == udp协议 sk.bind(('192.168.12.130',8080)) # 本机的ip地址 while True:
    msg_s,addr
    = sk.recvfrom(1024)      # msg_s 接收信息 msg_s = msg_s.decode('utf-8') a = random.choices(ls)
    print("%s %s 33[0m" % (a[0],msg_s))   a = input(">>>").encode('utf-8')      sk.sendto(a,addr)              #回复信息

    c:client 客户端

    import socket
    name = input('<<<<')
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    while 1:
        tall = input('<<')
        tall = name+':'+tall
        if tall == 'q':
            break
        sk.sendto(tall.encode('utf-8'),('192.168.12.130',8080))
    
        conn, addr = sk.recvfrom(1024)
        msg_r = conn.decode('utf-8')
        print(f'33[0;32;40m{name} : 33[1;32;44m{msg_r}33[0m')
    
    
    sk.close()

    ================用udp协议获取时间=============

    s:server 服务器  

    import socket
    import time
    sk
    = socket.socket(type=socket.SOCK_DGRAM) sk.bind(("127.0.0.1",8080)) while True: tm,addr = sk.recvfrom(1024) #接收 tm_f = time.strftime(tm.decode('utf-8')) #时间转换 sk.sendto(tm_f.encode('utf-8'),addr)  #发送 sk.close()

    c:client 客户端

    import socket
    import time
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    tm = input("请输入时间格式:")
    while True:
    
        sk.sendto(tm.encode("utf-8"),("127.0.0.1",8080))    #发送
        tma,addr = sk.recvfrom(1024)    #接收
        print(tma.decode("utf-8"))  
        time.sleep(3)
    
    
    sk.close()
    
    # %Y-%m-%d %H:%M:%S  时间格式 
  • 相关阅读:
    cocos2d-x 屏幕坐标系和OPenGL坐标系转换
    cocos2d-x 判断系统语言
    cocos2d-x 动画加速与减速
    高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?
    Netty学习三:线程模型
    java NIO原理及实例
    java多线程系列(四)---ReentrantLock的使用
    Java并发之AQS详解
    微服务踩坑之边界
    设计模式:观察者模式(有利于代码解耦)
  • 原文地址:https://www.cnblogs.com/luchenhui/p/9141959.html
Copyright © 2011-2022 走看看