Python 服务器连接

Python server connection

我想在 python 中编写一个客户端,将数据包发送到 TCP 服务器。 我不知道服务器实现,但它总是 return 像这样的菜单(例如在 nc server 4444 之后):

Make your choice:
1- test1
2- test2
3- insert two numbers
4- test4
5- test5
6- test6

然后我想用 python 自动化所有,例如我会发送以下序列:

1 (test1)
3 (insert two numbers)
2
1
6 (test6)

我已经尝试使用跟随脚本

class Connect(object):

    def connect(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print('connecting to host')
        sock.connect(('127.0.0.1',4444))
        return sock

    def send(self, command):
        sock = self.connect()
        recv_data = ""
        data = True

        print('sending: ' + command)
        sock.send(command)

        while data:
            data = sock.recv(1024)
            recv_data += data 
            print('received: ' + data)

        sock.close()
        return recv_data

def main():
    connect = Connect()
    connect.send("1")
    connect.send("3")
    connect.send("2")
    connect.send("1")
    connect.send("6")

if __name__ == "__main__":
    main()

但是不行!

有什么建议吗?

谢谢!

一些注意事项:

1.不要每次使用send就打开关闭连接。我们不知道服务器的实现,但绝对清楚服务器无法判断是同一个客户端重新连接还是新客户端。 TCP 根本没有这方面的工具。甚至您的客户端端口号也是由您 OS 随机选择的。打开连接一次,完成后关闭它。

2.您可能会在某个时候永远卡在这里:

while data:
    data = sock.recv(1024)

如果服务器关闭了连接,您可能会遇到异常。如果服务器没有任何东西要发送,它将永远等待。使用 select 检查服务器是否向您发送任何内容或使用 settimeout + exception hadling 让 recv 等待一定时间。

sock.recv 替换质量有问题的快速非 select 示例:

def try_recv(sock, bufsize, timeout):
    old_timeout = sock.gettimeout()
    sock.settimeout(timeout)
    try:
        data = sock.recv(bufsize)
    except socket.timeout:
        data = None
    sock.settimeout(old_timeout)
    return data

也许您不需要使用python。这个 bash 单行程序似乎可以满足您的需求:

printf "1\n3\n2\n1\n6\n" | telnet 127.0.0.1 4444