Найти - Пользователи
Полная версия: Сервер-клиент посредник
Начало » Python для новичков » Сервер-клиент посредник
1 2 3 4 5
Lam
Короче, как сказано делаю тему, итак к теме: есть клиент(пример: квип), есть сервер(пример: лог.асеку.ком) нужно написать программу посредник, тоесть в клиенте ставим конектить на петлю(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. Трейсбека в данном случае нет, если увеличить число повторов первого вайла тоже нет трейсбека, если его бесконечным сделать то вис… Эт если я правильно понял эт умное слово треисбек), в других вариантах моего кода всегда разные ошибки…
ZZZ
Во, это уже лучше. Теперь почитай 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)
Код я не проверял, так что это я оставлю тебе.
Lam
Спасибо тебе человече, трабла в модуле нет обекта сеттайм(вычеркнул его) запустил скрипт попрежнему ничего хорошего но в клиент аси уже началось движение, благополучно соединился с сервером и дошел до авториза, чуть поже разберусь с остальным, ещё раз спасибо)
Lam
A можно подробней как это будет выгледеть с селектом?
Lam
Всё сдаюсь, я наверно дурак дома у меня есть книжка по питону там должно быть написано как юзать селект, а здесь кроме телефона них нету, перерыл гугль сто раз них не нашел, а где нашел них не понял пробовал интуитивно запустить этот селект ничего конечно не вышло, что самое интересное даже ошибки не вышло…
ZZZ
Lam
трабла в модуле нет обекта сеттайм
Мнэээ… settimeout, это метод объекта socket.socket и вычёркивать здесь его очень не стоит. Лучше загляни в документацию по модулю socket.
И покажи вывод ошибки, мне стало интересно.

Что касается селекта, то я когда-то давно попытался понять, как он работает и… Разобрался с нитями. Это было очень давно. С тех пор даже не смотрю в его сторону, хотя и считается, что он в такого рода задачах, куда правильнее.
Lam
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 нету, и в пособиях ничего не нашел по сеттайм…
Andity
Lam
Lam
File “C:\private\2000b1a5\default.py”
Что-то мне подсказывает, что Вы запускаете это на Symbian.
igor.kaist
settimeout не поддкрживается на symbian :) читаем PyS60 Library Reference, хорошая вещь :)
Я так понимаю, топикстартер хочет расковырять протокол icq, для последующего написания собственного клиента на symbian? :)
Lam
Та такие цели мы тож преследуем, но щас я ток пытаюсь понять как эт рабит, как я понимаю мне остается продолжать поиск паралельных моделей?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB