Tôi đang cố gắng viết một ứng dụng dựa trên socket đơn giản bằng Python sẽ kết nối với máy chủ telnet. Tôi có thể kiểm tra máy chủ bằng cách telnetting đến cổng của nó (5007), và nhập văn bản. Nó đáp ứng với một NAK (lỗi) hoặc AK (thành công), đôi khi đi kèm với văn bản khác. Có vẻ rất đơn giản.Kết nối ổ cắm với máy chủ dựa trên telnet treo trên đọc
Tôi đã viết một khách hàng để kết nối và giao tiếp với máy chủ, nhưng nó bị treo trên nỗ lực đầu tiên để đọc phản hồi. Kết nối thành công. Các truy vấn như getockname và getpeername thành công. Lệnh gửi trả về một giá trị bằng với số ký tự tôi đang gửi, vì vậy nó có vẻ đang gửi đúng. Nhưng cuối cùng, nó luôn luôn treo khi tôi cố đọc phản hồi.
Tôi đã thử sử dụng cả hai đối tượng dựa trên tệp như readline và write (qua socket.makefile), cũng như sử dụng gửi và recv. Với đối tượng tập tin tôi đã thử làm cho nó với "rw" và đọc và viết thông qua đối tượng đó, và sau đó đã thử một đối tượng cho "r" và một đối tượng khác cho "w" để tách chúng ra. Không ai trong số này làm việc.
Tôi đã sử dụng gói sniffer để xem những gì đang diễn ra. Tôi không thông thạo tất cả những gì tôi thấy, nhưng trong một phiên telnet tôi có thể thấy văn bản đã nhập của tôi và văn bản của máy chủ sẽ trở lại. Trong kết nối socket Python của tôi, tôi có thể thấy văn bản của tôi sẽ đến máy chủ, nhưng các gói tin lại dường như không có bất kỳ văn bản nào trong đó.
Bất kỳ ý tưởng nào về những gì tôi đang làm sai hoặc bất kỳ chiến lược nào để thử?
Dưới đây là đoạn code tôi đang sử dụng (trong trường hợp này, nó có gửi và recv):
#!/usr/bin/python
host = "localhost"
port = 5007
msg = "HELLO EMC 1 1"
msg2 = "HELLO"
import socket
import sys
try:
skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print("Error creating socket: %s" % e)
sys.exit(1)
try:
skt.connect((host,port))
except socket.gaierror, e:
print("Address-related error connecting to server: %s" % e)
sys.exit(1)
except socket.error, e:
print("Error connecting to socket: %s" % e)
sys.exit(1)
try:
print(skt.send(msg))
print("SEND: %s" % msg)
except socket.error, e:
print("Error sending data: %s" % e)
sys.exit(1)
while 1:
try:
buf = skt.recv(1024)
print("RECV: %s" % buf)
except socket.error, e:
print("Error receiving data: %s" % e)
sys.exit(1)
if not len(buf):
break
sys.stdout.write(buf)
Ồ, trong trường hợp đó là hữu ích, đây là một phiên dụ telnet thực hiện bằng tay:
ubuntu:~/mac/python$ telnet localhost 5007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HELLO EMC 1 1
HELLO ACK EMCNETSVR 1.1
Dòng 'HELLO' đầu tiên là thứ tôi đã nhập, dòng thứ hai là câu trả lời.
tuyệt vời, các \ r đã làm các trick! tôi đã thử \ n trước đó (không hoạt động) nhưng không nhận thức được \ r. tuôn ra cũng không cần thiết. cảm ơn! – mix
hóa ra tôi cần \ r \ n, không chỉ \ r. \ r hoạt động trong một số trường hợp, nhưng không phải trong tất cả, điều này gây nhầm lẫn. \ n tự nó không hoạt động. – mix