一个连接/命令后,Python套接字关闭

时间:2018-06-26 22:08:20

标签: python sockets networking

客户端和服务器可以成功连接,但是只能发出一个命令。来到这里已经有一段时间了,需要外界的帮助,非常感谢您的任何反馈或建议的改进。

曾经看过其他暗示我可能过早关闭连接的帖子,但我不认为这是真的,因为尽管我可能是错的,但程序不会引发任何断开连接错误。

client.py

import socket
import sys
import os

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

##server = input("Enter server IP: ")
##print(server)
##
##port = int(input("Enter port: "))
##print(port)

def send_msg(msg):
    sock.sendall(msg.encode())

def get_msg():
    msg = sock.recv(2048).decode()
    return msg

server = "127.0.0.1"
port = 100

sock.connect((server, port))
print("Connecting to " + server + " on port " + str(port) + "\n")

while True:
    #Send data
    msg = input(os.getcwd() + "> ")
    print("Sending '" + msg + "'")
    send_msg(msg)

    #Response
    #amnt_exp = len(msg)
    #data = sock.recv(2048)
    data = get_msg()

    if data == "exit":
        print("\nClosing connection")
        sock.close()
    else:
        print("Received: \n" + data)

server.py

import socket
import sys
import os
import subprocess

#Create a TCP/IP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

##server = input("Enter server IP: ")
##print(server)
##
##port = int(input("Enter port: "))
##print(port)

def send_msg(msg):
    conn.sendall(msg.encode())

def get_msg():
    msg = conn.recv(2048).decode()
    return msg

server = "127.0.0.1"
port = 100

#Config
sock.bind((server, port))
print("Bound to " + server + " on port " + str(port) + "\n")


sock.listen(1)
print("Waiting for a connection...")
while True:
    conn, caddr = sock.accept()
    print("Connected!\n")
    print("Waiting for a command...")

    #data = conn.recv(2048).decode()
    data = get_msg()

    #Exit
    if data == "exit":
        print("\nConnection closed")
        conn.close()

    print("Received '" + data + "'")
    #Command Exec
    call = subprocess.Popen(data, stdout = subprocess.PIPE, shell=True)

    #Output
    output, err = call.communicate()
    call_status = call.wait()

    #print("Output: ", output)
    #print("Exit status: ", call_status)

    #Reply
    msg = "Command successful\n" + "Output: " + str(output) + "\n" + "Exit status:" + str(call_status) 
    print("Sending reply...")
    print("\nWaiting for a command...")
    send_msg(msg)

1 个答案:

答案 0 :(得分:0)

问题是您的服务器循环仅接受一个命令,然后又回到accept整个新连接,而不再查看旧连接。

您的输出相当误导,因为它确实打印出Waiting for a command...。但这只是因为您在print("\nWaiting for a command...")之前有一个额外的send_msg,并且在sock.accept之前没有任何输出。如果您使打印准确,则可以看到实际发生的情况。例如:

sock.listen(1)
while True:
    print('Waiting for a connection...') # inside the loop, not before it
    conn, caddr = sock.accept()
    # ... etc. ...
    print("Sending reply...")
    # Don't print Waiting for a command here, because you aren't
    send_msg(msg)
    # And print something after the send succeeds
    print("Sent")
    print()

那么,现在您知道出了什么问题,该如何解决?

简单。我们只需要一个嵌套循环。 accept客户端连接后,请继续使用该连接,直到它们退出:

sock.listen(1)
while True:
    print('Waiting for a connection...') # inside the loop, not before it
    conn, caddr = sock.accept()
    print("Connected!\n")

    while True:
        print("Waiting for a command...")
        data = get_msg()

        #Exit
        if data == "exit":
            print("\nConnection closed")
            conn.close()
            break # go back to the outer accept loop to get the next connection

        print("Received '" + data + "'")
        # ... etc. ...
        print()