Почему моя программа зависает, пока я слушаю сокет - PullRequest
0 голосов
/ 27 августа 2010

Итак, вот код:

obj.HOST = ""
obj.PORT = int(port.get()) # it's 100% correct PORT number
obj.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
obj.srv.bind((obj.HOST, obj.PORT))
obj.srv.listen(1)
obj.sock, obj.addr = obj.srv.accept()

class Client(threading.Thread):
     def __init__(self,from_):
        if from_.ip.get() == '':
            obj.HOST = 'localhost' # I am starting both programs from 1 computer, so it's 'localhost'
        else:
            obj.HOST = from_.ip.get()
        obj.PORT = int(from_.port.get()) # it's 100% correct PORT number (the same as previous)
        obj.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        obj.sock.connect((obj.HOST, obj.PORT))
        threading.Thread.__init__(self)
     def run(self):
        command = obj.sock.recv(1024)
        print command
        if command == 'confirm':
            print 'confirm'
        elif command == 'start':
            print 'start'

client = Client(cl) # cl is class, where I get port. It's works 100% correct
client.start()

Я запускаю ту же программу на своем компьютере.Один - хост, второй - клиент.

Вопрос 1: пока я жду соединения, мой серверный скрипт зависает.Как это починить?После подключения обе программы работают корректно, но когда сервер отправляет некоторую информацию (строку), клиентский скрипт зависает.

Вопрос 2: так как это можно исправить?

1 Ответ

0 голосов
/ 27 августа 2010

Не уверен, что такое объект.Но вы ничего не отправляете с сервера клиенту.на стороне сервера вы можете сделать что-то вроде этого:

conn, addr = srv.accept()
print 'Connected by', addr
conn.send("confirm")
conn.close()

Это позволит принять одно соединение, отправить некоторые данные «подтвердить», закрыть соединение и выйти.

То же самое с клиентомside:

def run(self):
        command = self.sock.recv(1024)
        print command
        print "Recieved : ", command
        self.sock.close()

Это подключится к серверу, получит некоторые данные, распечатает и закроет соединение.

recv является блокирующим вызовом и будет блокироваться, пока не получит некоторые данные от сервера.Это может быть причиной вашего замерзания.

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