LINUX.ORG.RU

Что я неправильно сделал?(python)


0

0

Написал код. Поидеи должен принимать клиента и создавать новый поток для работы с ним. Соединение принимает, но поток не начинается:

#! /usr/bin/python

import socket, string, threading

def talk_client(my_sock):
	print "Thead create"
	while 1:
		_data = my_sock.recv(1024)
		print "message prinat"
		if _data == "move":
			_data = _data + " move"
		elif _data == "fck":
			_data = _data + " mat"
		else:
			_data = "other"
		my_sock.send(_data)
		print "message send"
	my_sock.close()

HOST = ""
PORT = 33331
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
th_i = 0

while 1:
	srv.listen(1)
	sock, addr = srv.accept()
	print "Connect IP:", addr
	th = threading.Thread(target=talk_client, name="t" + str(th_i), args=[sock])
	th.start
	th_i = th_i + 1

Ответ на: комментарий от phoenix

Спасибо, помогло. Но возникает ошибка(все работает):
Exception in thread t0:Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/thr
eading.py", line 442, in __bootstrap
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/thr
eading.py", line 422, in run
    self.__target(*self.__args, **self.__kwargs)
  File "network.py", line 8, in talk_client
    _data = my_sock.recv(1024)
error: (54, 'Connection reset by peer')
Подобная же ошибка(пути другие) и в Windows

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

Судя по всему первая ошибка из-за того что поток как-то не так объявил.
 Где-то я видел другой вариант. Вторая ошибка из-за того что клиент
 разъединился. Как переделать цикл так, чтобы он выполнялся только при
 наличии соединения? Тоесть:
while есть ли соединение:
    действия

В таком случае я так понимаю после цикла соединение закрывать не нужно

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от anonymous

>используй select/poll/epoll, потоки ацтой

Аргументы,примеры в студию. Если Вы такой умный, то можете еще и помочь проблему

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

Аргумент в том, что у вас код не работает:) К тому же использовать стратегию потом-на-соединение, мягко говоря не хорошо:) А по поводу кода, просто поместите recv в блок try ... except.

anonymous
()
Ответ на: комментарий от anonymous

>Аргумент в том, что у вас код не работает:) К тому же использовать стратегию потом-на-соединение, мягко говоря не хорошо:) А по поводу кода, просто поместите recv в блок try ... except.

То что он неработает, это громко сказано. Вполне он работает. А ошибку путём тестирования удалось локализовать-она возникает при разъединении. Что в принципе логично, ведь я не предусмотрел обработку это ошибки. Насчет try except идея интересная. Сейчас попробую свой вариант, если не прокатит-сделаю try except

Motiv_studenta ★★
() автор топика

Вообщем может кому понадобится пример как реализовать сокеты в python 'e  с помощью многопоточности:

import socket, string, threading

def talk_client(my_sock):
	print "Thead create"
	while 1:
		try:
			_data = my_sock.recv(1024)
			print "message prinat"
			if _data == "move":
				_data = _data + " move"
			elif _data == "fck":
				_data = _data + " mat"
			else:
				_data = "other"
			my_sock.send(_data)
			print "message send"
		except:
			my_sock.close()
			print "Connect lost"
			break

HOST = ""
PORT = 33332
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
th_i = 0

while 1:
	srv.listen(1)
	sock, addr = srv.accept()
	print "Connect IP:", addr
	th = threading.Thread(target=talk_client, name="t" + str(th_i), args=[sock])
	th.start()
	th_i = th_i + 1

Всем спасибо за помощь

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

my_sock.close () перенести в finally

тебе правильно сказали, что такой способ реализации параллельного
сервера далек от идеала, почитай, что такой select, pre-fork.

P.S. Порадовала фраза "реализовать сокеты в python 'e  с помощью
многопоточности" ...

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

>my_sock.close () перенести в finally

>тебе правильно сказали, что такой способ реализации параллельного сервера далек от идеала, почитай, что такой select, pre-fork.

>P.S. Порадовала фраза "реализовать сокеты в python 'e с помощью многопоточности" ...

Можно поподробней про finally?

Это всего лишь макет, для отработки самого протокола

Фразу подбирал так, чтобы через поисковик было легче найти=)

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от satanic-mechanic

>См. документацию или какую-нибудь книгу по python на предмет try..finally

Смотрел я. Получается что он принимает сообщение(одно) и отключается

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

По поводу finally, я не прав - не вглядывался в код (я взглянул и подумал, что у тебя сервер обрабатывает сообщение и отключает клиента (закрывает сокет), теперь вижу, что не так). Немного необычный (ИМХО) способ организации (я бы так не делал), но вполне работоспособный и finally здесь действительно не нужен

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

я вот думаю... ничего что srv.listen(1) находится в цикле? Кстати программа черех очень много соединений откажет. Значение переменной не резиновое=)

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

> я вот думаю... ничего что srv.listen(1) находится в цикле? 
Конечно srv.listen (1) вон из цикла...

> Кстати программа черех очень много соединений откажет. Значение переменной не резиновое=)
Так не понятно, зачем ты вообще делаешь так, как делаешь. В чем фишка?
В чем задача?

Литература:
1. Снейдер. Эффективное программирование TCP/IP;
2. Лутц. Программирование на Python.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

>Так не понятно, зачем ты вообще делаешь так, как делаешь. В чем фишка? В чем задача?

я думал что у потока должно быть уникальное имя

Motiv_studenta ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.