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
我想在 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