Форум сайта python.su
Вот стандартный пример 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()
#!/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)
Офлайн
несколько сообщений можно отправить через этот же send, возможно проблема будет с приемом и определением где какое сообщение, для этого можно добавлять какой-нибудь разделитель между сообщениями
Офлайн
Так здесь по идеи так и должно работать
1-запускаю сервер.
2 запускаю клиента.
3 клиент пишет сообщение
4 сервер принимает.
5 клиент пишет сообщения
6 сервер принимает и.т.д.
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
Офлайн
MichaelN4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
Офлайн
o7412369815963Я даже об этом и ни подумал. Работаю сокетом первый раз.MichaelN4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
Офлайн
MichaelNДля разных задач разные решения.o7412369815963Я даже об этом и ни подумал. Работаю сокетом первый раз.MichaelN4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
А как тогда их так распарсить?, в книгах везде пример подсоединился к серверу послал сообщения, сервер принял дал ответ клиент закрыл подключение.
Или может так и надо, подключился послал команду принял ответ закрыл подключение, что бы ни занимать долго порт.
Офлайн
Изучаю питон вот добрался до темы coкеты решил попробовать.
А что хотел сделать.
Научить сервер выполнять мои команды, пример просмотр каталога на сервере и.т.д.
Что бы он клиенту возвращал данные.
Но вы все равно расскажите как можно за одно соединение передавать команды, или подскажите что почитать.
XMLRPC я пробовал.
Офлайн
> XMLRPC я пробовал.
для начала этого достаточно
> Но вы все равно расскажите как можно за одно соединение передавать команды, или подскажите что почитать.
Лучше использовать готовые (отлаженные) либы, чем изобретать колесо. Но если для обучения, то можно и колесо.
Способов много, например можно установить фиксированный размер сообщения, можно использовать разделитель между сообщениями, можно в начале сообщения указывать размер сообщения…
Для передачи “сообщений” можно заюзать ZeroMQ, его применяют в высоко нагруженных проектах.
Отредактировано (Окт. 13, 2011 18:07:27)
Офлайн
Может Вы, знаете пример, где можно взглянуть на такой велосипед?
Офлайн
хз, в инете должны примеры валяться.
вот пример с однопоточным сервером
# 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()
Офлайн