Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 21, 2008 00:47:29

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

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

import socket
host1 = '127.0.0.1'
host2 = 'login.icq.com'
port1 = 8766
k = 1
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind((host1, port1))
s2.connect((host2, port1))
s1.listen(5)
conn, addr = s1.accept()
print 'klient connect'
Тут вроде всё норм, хотя тоже не уверен, если здесь ошибка тож поправте пожалуйста, дальше больше, дальше нужна передача пакетов:
s2.setblocking(0) #очень странная фича, если ставить другие цифры не 1 не 0, а скажем пять что происходит?
conn.setblocking(0)
r1 = r2 = ''
while k < 20: #пробовал и больше цикл сделать, в будущем планирую бесконечный, но пока это лишнее
while 1:
r11 = conn.recv(1) #пробовал принимать и больше единицы, возможно нужно указывать точный размер пакета, тогда вопрос как его определить?
if not r11: break
r1 = r1 + r11 #пробовал сразу отправлять r11
s2.send(r1)
while 1:
r21 = s2.recv(1)
if not r21: break
r2 = r2 + r21
conn.send(r2)
k = k + 1
print k
вот вобщем для начала всё, поидее прога должна делать то что я от нее требую, однако скрипт выполняется но связи клиента с сервером не происходит:(
P.S. Трейсбека в данном случае нет, если увеличить число повторов первого вайла тоже нет трейсбека, если его бесконечным сделать то вис… Эт если я правильно понял эт умное слово треисбек), в других вариантах моего кода всегда разные ошибки…



Отредактировано (Дек. 21, 2008 01:10:15)

Офлайн

#2 Дек. 21, 2008 01:18:39

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Сервер-клиент посредник

Во, это уже лучше. Теперь почитай PEP-8, на предмет оформления кода.

setblocking, говорит о том, блокинуемый это сокет, или нет. Очень хорошо комбинируется с settimeout и ловлей socket.error. И для этой программы, тебе придётся это использовать.

Теперь о главном. Алгоритм неверен изначально.
Направление передачи данных должны обрабатыватья параллельно. Я ты использовал нити, но более правильным решением, будет select.select.

С другой стороны можно сделать так:

s1.setblocking(1)
s1.settimeout(0.05)
conn.setblocking(1)
conn.settimeout(0.05)

def move(i, o):
try:
tmp = ""
while True:
tmp += i.recv(1)
except socket.error:
o.send(tmp)

while True:
move(s1, conn)
move(conn, s1)
Код я не проверял, так что это я оставлю тебе.



Отредактировано (Дек. 21, 2008 01:38:33)

Офлайн

#3 Дек. 21, 2008 14:11:32

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

Спасибо тебе человече, трабла в модуле нет обекта сеттайм(вычеркнул его) запустил скрипт попрежнему ничего хорошего но в клиент аси уже началось движение, благополучно соединился с сервером и дошел до авториза, чуть поже разберусь с остальным, ещё раз спасибо)



Офлайн

#4 Дек. 21, 2008 18:13:15

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

A можно подробней как это будет выгледеть с селектом?



Офлайн

#5 Дек. 22, 2008 00:53:56

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

Всё сдаюсь, я наверно дурак дома у меня есть книжка по питону там должно быть написано как юзать селект, а здесь кроме телефона них нету, перерыл гугль сто раз них не нашел, а где нашел них не понял пробовал интуитивно запустить этот селект ничего конечно не вышло, что самое интересное даже ошибки не вышло…



Офлайн

#6 Дек. 22, 2008 02:35:46

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Сервер-клиент посредник

Lam
трабла в модуле нет обекта сеттайм
Мнэээ… settimeout, это метод объекта socket.socket и вычёркивать здесь его очень не стоит. Лучше загляни в документацию по модулю socket.
И покажи вывод ошибки, мне стало интересно.

Что касается селекта, то я когда-то давно попытался понять, как он работает и… Разобрался с нитями. Это было очень давно. С тех пор даже не смотрю в его сторону, хотя и считается, что он в такого рода задачах, куда правильнее.



Офлайн

#7 Дек. 22, 2008 10:58:42

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

Traceback (most recent call last):
File "C:\private\2000b1a5\default.py", line 81, in menu_action
f()
File "C:\private\2000b1a5\default.py", line 65, in query_and_exec
execfile(script_list[index][1].encode('utf-8'), script_namespace.namespace)
File "c:\python\123.py", line 16, in ?
s2.settimeout(0.05)
AttributeError: '_socketobject' object has no attribute 'settimeout'
вот такое выдает, в самом модуле даж слова settime нету, и в пособиях ничего не нашел по сеттайм…



Офлайн

#8 Дек. 22, 2008 11:09:51

Andity
От:
Зарегистрирован: 2008-02-22
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

Lam

Lam
File “C:\private\2000b1a5\default.py”
Что-то мне подсказывает, что Вы запускаете это на Symbian.



Офлайн

#9 Дек. 22, 2008 14:32:51

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

settimeout не поддкрживается на symbian :) читаем PyS60 Library Reference, хорошая вещь :)
Я так понимаю, топикстартер хочет расковырять протокол icq, для последующего написания собственного клиента на symbian? :)



Отредактировано (Дек. 22, 2008 14:35:56)

Офлайн

#10 Дек. 22, 2008 15:54:01

Lam
От:
Зарегистрирован: 2008-12-20
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

Сервер-клиент посредник

Та такие цели мы тож преследуем, но щас я ток пытаюсь понять как эт рабит, как я понимаю мне остается продолжать поиск паралельных моделей?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version