• socket模块的使用


    socket模块

    学习网络编程,其实就是学习socket模块。

    socket是什么?

    翻译过来就是套接字,是对底层的TCP IP UDP等网络协议进行封装

    使得上层的应用程序开发者,不用直接接触这些复杂的,艰涩的协议。

    对于程序而言,他就是封装好的模块。要完成网络通信,只需要系统提供的socket模块就行。

    TCP与UDP协议

    TCP与UDP协议是传输层最常见的协议。

    主要控制传输数据的方式。

    TCP的传输方式:

    优点:通过三次握手来与服务器建立连接
    可以保证数据的完整性
    a机器给b机器发送数据包 要求b机器必须立即返回一个确认包
    a机器会等待一段时间,如果超时还没有收到确认,则重发数据
    缺点:传输效率低
    使用场景: 文字聊天,支付宝转账等
    UDP
    传输方式:不需要建立连接,直接发送
    缺点: 不能保证数据的完整性
    优点:传输效率比TCP高
    使用场景:视频通话,语音通话,UDP




    使用socket搭建最简单服务器
    TCP服务器代码
    import socket
    
    server = socket.socket()
    #创建一个套字节对象
    ip_port= ("127.0.0.1",12323)
    server.bind(ip_port)
    #绑定服务器地址和端口号
    print(1)#不产生阻塞
    server.listen(5)#不阻塞
    #服务端开始阻塞,等待监听客户端的信息
    #5 代表着最大等待的连接数量
    print(2)
    client,client_adress = server.accept()#阻塞,等待客户端发送的数据
    #client这个对象是与客户端程序的连接对象,用来接收和发送信息。
    print(3)
    msg = client.recv(1024)#阻塞
    #接收客户端发送的数据(必须是二进制信息)
    print(msg.decode("utf-8"))
    
    client.send("收到数据".encode("utf-8"))
    #向客户端发送数据
    
    client.close()
    #关闭客户端和服务端的关系
    
    # server.close()
    #一般不关闭服务端对象
    客户端
    import socket
    
    client =socket.socket()
    #客户端套接字对象
    
    client.connect(("127.0.0.1",12323))
    #请求与服务端产生连接与accpet()发生交互,超时就会抛出异常
    
    client.send("客户端信息".encode("utf-8"))
    #与服务器发送数据,与recv()发生交互
    msg = client.recv(1024)
    #接收的信息
    print(msg.decode("utf-8"))
    client.close()#关闭连接

    UDP 

    import socket
    
    udp_server = socket.socket(type=socket.SOCK_DGRAM)
    #形成一个socket对象,UDP形式的服务器
    
    udp_server.bind(("127.0.0.1",11011))
    #生成使用本机地址和端口号
    
    #udp 不需要监听,随缘接收  listen(TCP 专属)
    #不需要accept 生成连接对象,不需要产生连接,任意发送到服务器的数据直接接受
    msg = udp_server.recv(1024)#阻塞,直到接收消息后才会执行
    print(msg)
    msg1,address=udp_server.recvfrom(1024)#使用recvfrom,可得到的(信息,(地址端口))
    #信息,和发送端的ip 端口号
    
    print(msg1.decode("utf-8"))
    print(address)
    
    udp_server.close()

    客户端

    import socket
    
    udp_client = socket.socket(type=socket.SOCK_DGRAM)#指定创建的套字节对象使用UDP协议
    
    msg = input("消息1:》》").encode("utf-8")
    udp_client.sendto(msg,("127.0.0.1",11011))#udp发送,没有建立与服务端的连接,只能指定ip和端口发送
    msg1 = input("消息2:》》").encode("utf-8")
    udp_client.sendto(msg1,("127.0.0.1",11011))#指定需要地址端口发送,即使没有返回值也不会报错
    
    udp_client.close()






  • 相关阅读:
    新学期的合作
    软件工程问题及回答
    《程序猿的生命周期》阅读有感
    《构建之法》13~17章
    阅读《构建之法》十一、十二、十三章之感
    阅读《构建之法》十一、十二、十三章
    【.NET / C#】SubarrayUtils(查找子数组工具类)
    【Java】ComplexTimerTask (TimerTask 拓展封装)
    【Java】AesCbcCodec(AES_CBC加解密工具类)
    【Java】AesEcbCodec(AES_ECB加解密工具类)
  • 原文地址:https://www.cnblogs.com/msj513/p/9898395.html
Copyright © 2020-2023  润新知