代码之家  ›  专栏  ›  技术社区  ›  John Bannister

如何在终端的UDP连接中发送和操作整数

  •  0
  • John Bannister  · 技术社区  · 7 年前

    所以我对我节目的这一部分有困难。现在,用我当前的代码,我可以通过终端与另一台计算机连接和通信,但我无法发送整数并将其识别为整数。

    我需要能够向服务器发送一个数字,并让服务器处理该数字(例如,添加1),然后将结果返回给客户端,并在服务器端打印出结果。

    我一辈子都无法让它将这种通信识别为一个整数而不是字符串!

    以下是我在终端服务器端的连接方式:

    python ./udpEchoServer.py -s 4004
    

    下面是我在终端客户端的连接方式:

    python ./udpEchoServer.py -c [IP ADDRESS OF THE SERVER] 4004
    

    以下是我目前的代码:

    #! /usr/bin/env python
    
    # Client and server for udp (datagram) echo.
    #
    # Usage: udpecho -s [port]            (to start a server)
    # or:    udpecho -c host [port] <file (client)
    
    import sys
    from socket import *
    
    ECHO_PORT = 50000 + 7
    BUFSIZE = 1024
    
    def main():
        if len(sys.argv) < 2:
            usage()
        if sys.argv[1] == '-s':
            server()
        elif sys.argv[1] == '-c':
            client()
        else:
            usage()
    
    def usage():
        sys.stdout = sys.stderr
        print 'Usage: udpecho -s [port]            (server)'
        print 'or:    udpecho -c host [port] <file (client)'
        sys.exit(2)
    
    def server():
        if len(sys.argv) > 2:
            port = eval(sys.argv[2])
        else:
            port = ECHO_PORT
        s = socket(AF_INET, SOCK_DGRAM)
        s.bind(('', port))
        print 'udp echo server ready'
        while 1:
            data, addr = s.recvfrom(BUFSIZE)
            print 'server received %r from %r' % (data, addr)
            s.sendto(data, addr)
    
    def client():
        if len(sys.argv) < 3:
            usage()
        host = sys.argv[2]
        if len(sys.argv) > 3:
            port = eval(sys.argv[3])
        else:
            port = ECHO_PORT
        addr = host, port
        s = socket(AF_INET, SOCK_DGRAM)
        s.bind(('', 0))
        print 'udp echo client ready, reading stdin'
        while 1:
            line = sys.stdin.readline()
            if not line:
                break
            s.sendto(line, addr)
            data, fromaddr = s.recvfrom(BUFSIZE)
            print 'client received %r from %r' % (data, fromaddr)
    
    main()
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   abarnert    7 年前

    UDP消息只是字节。如果你想让他们通过其他考试,你必须 序列化 它位于发送端,并且 反序列化 它位于接收端。(有时这称为封送处理或编码,而不是序列化。)

    序列化数据的一种常见方法是JSON,它处理较小的整数、浮点、字符串、浮点的dict列表等

    但更简单的方法是 str int ,如果您只想发送ints:

    num = 5
    s.sendto(str(num), add)
    

    并接收号码:

    data, addr = s.recvfrom(BUFSIZE)
    num = int(data)
    

    事实上,您已经在客户端有效地做到了这一点——您读取一行输入,作为字符串,然后发送它。因此,您无需在服务器上添加任何内容:

    data, addr = s.recvfrom(BUFSIZE)
    num = int(data)
    print 'server received %r from %r' % (data, addr)
    data = str(num + 1)
    s.sendto(data, addr)