Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Клиент – сервер, как за одно подключения отправить несколько сообщений [RSS Feed]

#1 Окт. 12, 2011 10:36:07

MichaelN
От:
Зарегистрирован: 2011-04-02
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

Вот стандартный пример echo-server, и клиент
Сервер постоянно слушает
А клиент хочет по очереди передать сообщения, не отключаясь от клиента.

Server

#!/usr/bin/env python
# coding=utf-8

import socket

class MyTCPServer( object ):

def __init__(self, adress='127.0.0.1', port='9999'):
self.addr = adress
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind( ( self.addr, self.port ) )
self.sock.listen(5)
def run(self):
while True:
client, addr = self.sock.accept()
print 'connect:%s' % addr
data = client.recv(1024)
print 'Message:%s' % data

if __name__ == '__main__':
HOST, PORT = '127.0.0.1', 9999
try:
server = MyTCPServer()
server.run()
Client
#!/usr/bin/env python
# coding=utf-8

import socket
import sys

class ClientRCP(object):

def __init__(self, ip_address='127.0.0.1', port=9999):

self.id_addr = ip_address
self.port = int( port )
self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
try:
self.sock.connect( ( self.id_addr, self.port ) )
except socket.error, er:
print 'Failed connection to:%s on port:%s' % ( self.id_addr, self.port )
self.sock.close()
sys.exit(0)

def sent_mess(self, mess):

self.sock.send( mess )

if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser(usage='''\
prog: [options]
-a --address = address server
-p --port = port server
Example:
client.py -a 192.168.1.2 -p 8090
''')
parser.add_option('-a', '--address', dest='address', default='127.0.0.1',
help='Address for connect to server', metavar='ADDRESS')
parser.add_option('-p', '--port', dest='port', default='9999',
help='Port for connect to server', metavar='PORT')
( option, argv ) = parser.parse_args()
print 'Args %s, %s' % ( option, argv )
myclient = ClientRCP( option.address, option.port )
while True:
stt = raw_input('Input message:')
myclient.sent_mess(stt)



Офлайн

#2 Окт. 12, 2011 11:16:19

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

несколько сообщений можно отправить через этот же send, возможно проблема будет с приемом и определением где какое сообщение, для этого можно добавлять какой-нибудь разделитель между сообщениями

Офлайн

#3 Окт. 12, 2011 15:27:40

MichaelN
От:
Зарегистрирован: 2011-04-02
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

Так здесь по идеи так и должно работать
1-запускаю сервер.
2 запускаю клиента.
3 клиент пишет сообщение
4 сервер принимает.
5 клиент пишет сообщения
6 сервер принимает и.т.д.
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.



Офлайн

#4 Окт. 12, 2011 18:10:35

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения

Офлайн

#5 Окт. 13, 2011 08:30:13

MichaelN
От:
Зарегистрирован: 2011-04-02
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

o7412369815963
MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Я даже об этом и ни подумал. Работаю сокетом первый раз.
А как тогда их так распарсить?, в книгах везде пример подсоединился к серверу послал сообщения, сервер принял дал ответ клиент закрыл подключение.
Или может так и надо, подключился послал команду принял ответ закрыл подключение, что бы ни занимать долго порт.



Офлайн

#6 Окт. 13, 2011 12:35:28

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

MichaelN
o7412369815963
MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Я даже об этом и ни подумал. Работаю сокетом первый раз.
А как тогда их так распарсить?, в книгах везде пример подсоединился к серверу послал сообщения, сервер принял дал ответ клиент закрыл подключение.
Или может так и надо, подключился послал команду принял ответ закрыл подключение, что бы ни занимать долго порт.
Для разных задач разные решения.
Вам для чего?

Офлайн

#7 Окт. 13, 2011 14:14:39

MichaelN
От:
Зарегистрирован: 2011-04-02
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

Изучаю питон вот добрался до темы coкеты решил попробовать.
А что хотел сделать.
Научить сервер выполнять мои команды, пример просмотр каталога на сервере и.т.д.
Что бы он клиенту возвращал данные.
Но вы все равно расскажите как можно за одно соединение передавать команды, или подскажите что почитать.
XMLRPC я пробовал.



Офлайн

#8 Окт. 13, 2011 18:05:22

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

> XMLRPC я пробовал.
для начала этого достаточно

> Но вы все равно расскажите как можно за одно соединение передавать команды, или подскажите что почитать.
Лучше использовать готовые (отлаженные) либы, чем изобретать колесо. Но если для обучения, то можно и колесо.
Способов много, например можно установить фиксированный размер сообщения, можно использовать разделитель между сообщениями, можно в начале сообщения указывать размер сообщения…

Для передачи “сообщений” можно заюзать ZeroMQ, его применяют в высоко нагруженных проектах.

Отредактировано (Окт. 13, 2011 18:07:27)

Офлайн

#9 Окт. 16, 2011 20:02:36

MichaelN
От:
Зарегистрирован: 2011-04-02
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

Может Вы, знаете пример, где можно взглянуть на такой велосипед?



Офлайн

#10 Окт. 16, 2011 21:25:15

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Клиент – сервер, как за одно подключения отправить несколько сообщений

хз, в инете должны примеры валяться.
вот пример с однопоточным сервером

# coding:utf8

import socket
import thread
import time

div = '\0xff\0xff'

def server():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind( ( '127.0.0.1', 9999 ) )
sock.listen(1)
buf = ''
loop = True
while loop:
client, addr = sock.accept()
while loop:
data = client.recv(1024)
if not data: break
buf += data
while div in buf:
d = buf.split(div, 1)
msg = d[0]
if len(d) > 1: buf = d[1]
else: buf = ''
#
if msg == 'exit': loop = False
print 'Message:%s' % msg
msg += ' ok'
client.send(msg)
time.sleep(0.2)
sock.close()

def client(param):
def send(msg):
sock.send(msg+div)
return sock.recv(16384)
time.sleep(0.1)
if param: time.sleep(0.2)
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock.connect( ( '127.0.0.1', 9999 ) )
print send('hello1')
print send('hello2')
print send('hello3')
if param: print send('exit')
sock.close()

thread.start_new_thread(client, (None,))
thread.start_new_thread(client, (1,))

server()

Офлайн

  • Начало
  • » Network
  • » Клиент – сервер, как за одно подключения отправить несколько сообщений[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version