• Python Socket Programming UDP/TCP


    基于UDP/TCP的套接字编程demo

    UDP 客户端/服务器

    一个简单的基于UDP协议的客户端和服务器应用的进程通信。

    逻辑:

    客户端会给服务器发送小写的英文字母,服务器接受后,把它转化成大写再返回给客户端,客户端输出这组数字。由于Python3已经明确区分了str类和bytes类,因此发送的是字节。

    UDP服务器:

    from socket import *
    
    udp_server_socket = socket(AF_INET, SOCK_DGRAM)
    udp_server_port = 9600
    name = gethostname()
    udp_server_socket.bind(('', udp_server_port))
    
    while True:
        print('The Sever is ready to receive')
        # 这段代码会一直处于阻塞状态,除非收到了响应
        message, client_address = udp_server_socket.recvfrom(2048)
        print('Client Address:', str(client_address), 'Coming!')
        modified_message = message.upper()
        udp_server_socket.sendto(modified_message, client_address)
    

    UDP客户端

    from socket import *
    
    server_ip = '127.0.0.1'
    server_port = 9600
    
    udp_client_socket = socket(AF_INET, SOCK_DGRAM)
    message = b'hello'
    # 发送给服务器
    udp_client_socket.sendto(message, (server_ip, server_port))
    
    # 接受服务器的返回内容
    modified_message, sever_address = udp_client_socket.recvfrom(2048)
    print(modified_message)
    
    udp_client_socket.close()
    

    TCP 客户端/服务器

    一个简单的基于TCP协议的客户端和服务器应用的进程通信。

    TCP服务器

    from socket import *
    
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    tcp_server_port = 9700
    
    tcp_server_socket.bind(('127.0.0.1', tcp_server_port))
    tcp_server_socket.listen(1)
    
    while True:
        # 等待连接
        print('Waiting for connecting!')
        # 建立TCP连接
        connection_socket, addr = tcp_server_socket.accept()
        print('Connected from:', addr)
        message = connection_socket.recv(2048)
        print('The Sever is ready to receive')
    
        upper_message = message.upper()
        print(upper_message)
        connection_socket.send(upper_message)
        connection_socket.close()
    

    TCP客户端

    from socket import *
    
    server_ip = '127.0.0.1'
    server_port = 9700
    
    tcp_client_socket = socket(AF_INET, SOCK_STREAM)
    tcp_client_socket.connect((server_ip, server_port))
    
    message = b'hello'
    # 发送给服务器
    tcp_client_socket.send(message)
    
    # 接受服务器的返回内容
    modified_message = tcp_client_socket.recv(2048)
    print('Modified Message:', modified_message)
    
    tcp_client_socket.close()
    

    小结

    在写这个demo的时候,犯了几个小错误:

    1. 在TCP的服务端socket中,我的recv方法不是在连接的connection_socket上操作的,导致了一个错误:Transport endpoint is not connected
      类似:https://stackoverflow.com/questions/35969714/error-transport-endpoint-is-not-connected-python-sockets

    2. 在TCP的客户端socket中,我的recv方法想当然的接受了两个参数,导致错误。 这显示是因为没有区分好TCP和UDP的Socket的不同点。
      由于TCP是面向连接的,每次在读写的socket对象,不必填入目标主机的地址,只需要直接读写数据即可,因此只能接受一个参数(data)。
      而UDP是无连接,每次需要在发送数据需要时填入目标主机的地址,接受时始终也是两个参数: data和address。

  • 相关阅读:
    MongoDB数据库遭大规模勒索攻击,被劫持26000多台服务器 #精选GITHUBMYSQL
    前端追着设计砍系列的9个超酷网页特效
    15款不容错过的前端开发Javascript和css类库
    恶性循环中的永生bug,可以说是相当写实了
    你是码农还是专家?看看你是哪一类程序员
    夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
    五毛党可能要失业了,因为AI水军来了
    现代软件工程 第五章 【团队和流程】练习与讨论
    现代软件工程 第四章 【结对编程】练习与讨论
    现代软件工程 课件 软件工程师能力自我评价表
  • 原文地址:https://www.cnblogs.com/crb912/p/9060670.html
Copyright © 2020-2023  润新知