Почему соединение отказано, когда клиент и сервер работают в одном и том же процессе? - PullRequest
2 голосов
/ 21 мая 2011

У меня проблема с запуском клиента и сервера в одном процессе.Каждый раз, когда я пытаюсь подключить мой клиент к серверу, это выдает мне такую ​​ошибку:

Traceback (most recent call last):
File "dirWatch.py", line 78, in <module>
startDirWatch(sLink)
File "dirWatch.py", line 68, in startDirWatch
sC.client('/home/homer/Downloads/test.txt')
File "/home/homer/Desktop/CSC400/gsync/serverClient.py", line 15, in client
sock.connect((host,port))
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused

Вот код, который я использовал, я в основном пытаюсь создать программу для синхронизации файлов.Я новичок в StackOverflow, поэтому, пожалуйста, извините, если я не предоставил более подробную информацию.Вот код, который я тестирую, код клиента и сервера:

thread.start_new_thread(sC.server ,('localhost', 50001))
sC.client('/home/homer/Downloads/test.txt')

Вот фактический код для клиентского сервера, он довольно простой, я просто хочу, чтобы они подключились:

def client(filename, host = defaultHost, port = defaultPort):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((host,port))
    sock.send((filename + '\n').encode())

    sock.close()

def serverthread(clientsock):
    sockfile = clientsock.makefile('r')
    filename = sockfile.readline()[:-1]
    try:
        print filename

    except:
       print('Error recieving or writing: ', filename)
    clientsock.close()

def server(host, port):
    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.bind((host,port))
    serversock.listen(5)
    while True:
        clientsock, clientaddr = serversock.accept()
        print('Connection made');
        thread.start_new_thread(serverthread, (clientsock,))

Любая помощь или совет будут оценены.Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Вместо того, чтобы справляться с трудностями синхронизации потоков и низкоуровневыми причудами сокетов (например, socket.send не гарантирует отправку всей передаваемой строки!), Попробуйте Twisted попробовать!

Вот версия вашей демонстрации с использованием Twisted, без проблем с синхронизацией:

from twisted.internet import reactor
from twisted.internet.protocol import ServerFactory, ClientFactory
from twisted.protocols.basic import LineOnlyReceiver

class FileSyncServer(LineOnlyReceiver):
    def lineReceived(self, line):
        print "Received a line:", repr(line)
        self.transport.loseConnection()

class FileSyncClient(LineOnlyReceiver):
    def connectionMade(self):
        self.sendLine(self.factory.filename)
        self.transport.loseConnection()


def server(host, port):
    factory = ServerFactory()
    factory.protocol = FileSyncServer
    reactor.listenTCP(port, factory, interface=host)


def client(filename, host, port):
    factory = ClientFactory()
    factory.protocol = FileSyncClient
    factory.filename = filename
    reactor.connectTCP(host, port, factory)


server("localhost", 50001)
client("test.txt", "localhost", 50001)
reactor.run()
1 голос
/ 21 мая 2011

Моим первым предположением будет то, что когда клиент пытается подключиться, поток сервера на самом деле еще не запущен;клиент подключается, но ничего не слушает.Создание потока и передача ему управления занимает значительное время.Вы можете либо спать перед подключением клиента, либо повторить попытку несколько раз, либо позаботиться об этом и получить сигнал потока сервера, когда сокет открыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...