Найти - Пользователи
Полная версия: Клиент – сервер, как за одно подключения отправить несколько сообщений
Начало » Network » Клиент – сервер, как за одно подключения отправить несколько сообщений
1 2
MichaelN
Вот стандартный пример 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)
o7412369815963
несколько сообщений можно отправить через этот же send, возможно проблема будет с приемом и определением где какое сообщение, для этого можно добавлять какой-нибудь разделитель между сообщениями
MichaelN
Так здесь по идеи так и должно работать
1-запускаю сервер.
2 запускаю клиента.
3 клиент пишет сообщение
4 сервер принимает.
5 клиент пишет сообщения
6 сервер принимает и.т.д.
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
o7412369815963
MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
MichaelN
o7412369815963
MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Я даже об этом и ни подумал. Работаю сокетом первый раз.
А как тогда их так распарсить?, в книгах везде пример подсоединился к серверу послал сообщения, сервер принял дал ответ клиент закрыл подключение.
Или может так и надо, подключился послал команду принял ответ закрыл подключение, что бы ни занимать долго порт.
o7412369815963
MichaelN
o7412369815963
MichaelN
Но после четвертого шага клиент отсылает сообщение сервер не отображает что оно пришло.
4-е сообщение могло прийти вместе с 3-им, данные могут склеиваться и разрываться в разных местах - это “поток”, а не отдельные сообщения
Я даже об этом и ни подумал. Работаю сокетом первый раз.
А как тогда их так распарсить?, в книгах везде пример подсоединился к серверу послал сообщения, сервер принял дал ответ клиент закрыл подключение.
Или может так и надо, подключился послал команду принял ответ закрыл подключение, что бы ни занимать долго порт.
Для разных задач разные решения.
Вам для чего?
MichaelN
Изучаю питон вот добрался до темы coкеты решил попробовать.
А что хотел сделать.
Научить сервер выполнять мои команды, пример просмотр каталога на сервере и.т.д.
Что бы он клиенту возвращал данные.
Но вы все равно расскажите как можно за одно соединение передавать команды, или подскажите что почитать.
XMLRPC я пробовал.
o7412369815963
> XMLRPC я пробовал.
для начала этого достаточно

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

Для передачи “сообщений” можно заюзать ZeroMQ, его применяют в высоко нагруженных проектах.
MichaelN
Может Вы, знаете пример, где можно взглянуть на такой велосипед?
o7412369815963
хз, в инете должны примеры валяться.
вот пример с однопоточным сервером
# 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()
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