Форум сайта python.su
Короче, как сказано делаю тему, итак к теме: есть клиент(пример: квип), есть сервер(пример: лог.асеку.ком) нужно написать программу посредник, тоесть в клиенте ставим конектить на петлю(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
Отредактировано (Дек. 21, 2008 01:10:15)
Офлайн
Во, это уже лучше. Теперь почитай 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)
Офлайн
Спасибо тебе человече, трабла в модуле нет обекта сеттайм(вычеркнул его) запустил скрипт попрежнему ничего хорошего но в клиент аси уже началось движение, благополучно соединился с сервером и дошел до авториза, чуть поже разберусь с остальным, ещё раз спасибо)
Офлайн
A можно подробней как это будет выгледеть с селектом?
Офлайн
Всё сдаюсь, я наверно дурак дома у меня есть книжка по питону там должно быть написано как юзать селект, а здесь кроме телефона них нету, перерыл гугль сто раз них не нашел, а где нашел них не понял пробовал интуитивно запустить этот селект ничего конечно не вышло, что самое интересное даже ошибки не вышло…
Офлайн
LamМнэээ… settimeout, это метод объекта socket.socket и вычёркивать здесь его очень не стоит. Лучше загляни в документацию по модулю socket.
трабла в модуле нет обекта сеттайм
Офлайн
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'
Офлайн
Lam
LamЧто-то мне подсказывает, что Вы запускаете это на Symbian.
File “C:\private\2000b1a5\default.py”
Офлайн
settimeout не поддкрживается на symbian :) читаем PyS60 Library Reference, хорошая вещь :)
Я так понимаю, топикстартер хочет расковырять протокол icq, для последующего написания собственного клиента на symbian? :)
Отредактировано (Дек. 22, 2008 14:35:56)
Офлайн
Та такие цели мы тож преследуем, но щас я ток пытаюсь понять как эт рабит, как я понимаю мне остается продолжать поиск паралельных моделей?
Офлайн