Найти - Пользователи
Полная версия: Обработка файла на сервере и передача клиенту
Начало » Network » Обработка файла на сервере и передача клиенту
1
sanodin
На сервер передаю файл, обрабатываю, хочу отправить результат обработки назад клиенту, не получается, вернее передать назад получается а вот принять уже не могу клиентом, мне приходится закрывать соединение что бы установить новое а сервер уже не может передать по старому соединению
#server
 
from socket import *
from rscan import Rscan
def imag(x):
    text = Rscan.ima(x)
    #print text
    text = text.replace("\n"," ")
    
    return text
 
HOST = 'localhost'                 
PORT = 4444
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
fil = open("i.jpg", "wb")
while 1:
        f=conn.recv(1024)
        print f
        fil.write(str(f))
        if not f:
            break
            
fil.close()
res = imag('i.jpg')
print res
conn.send(res)
            
conn.close()
from socket import *
 
HOST = "localhost"
PORT = 4444
s = socket(AF_INET,SOCK_STREAM)
s.connect((HOST, PORT))
print "Client running on %s port %s" % (HOST, PORT)
fil = open("eurotext.jpg", "rb")
while True:
        buf = fil.read(40)
        if len(buf) == 0:
                break
        
        #print buf
        s.send(buf)
s.close()
или может быть надо сделать два в одном, после передачи клиент закрывает соединение, открывает новое как сервер и ждет результата обработки?
py.user.next
sanodin
или может быть надо сделать два в одном, после передачи клиент закрывает соединение, открывает новое как сервер и ждет результата обработки?
должен быть цикл с несколькими ( >= 2) состояниями
в состоянии передачи передал, перешёл в состояние приёма
в состоянии приёма принял, перешёл в состояние передачи

wiki. конечный автомат
wiki. пример
sanodin
Значение в байтах при приеме можно максимальное ставить или нет?
сервер
import socket
import threading
from rscan import Rscan
def imag(x):
    text = Rscan.ima(x)
    #print text
    text = text.replace("\n"," ")
    print text
    return text
host = "localhost"
port = 44444
 
while True:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(1)
    conn, addr = s.accept()
    dest = open('i.jpg', 'wb')
    data = conn.recv(30000000)
    dest.write(data)
    dest.close()
    res = imag('i.jpg')
    print res
    conn.send(res)
    conn.close()
клиент
import socket
 
host = "localhost"
port = 44444
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
source = open("eurotext.jpg",'rb')
data = source.read()
source.close()
s.send(data)
print 'Data has been sent'
result = s.recv(1024)
print result
s.close()
py.user.next
sanodin
Значение в байтах при приеме можно максимальное ставить или нет?
надо поблочно принимать
sanodin
Получилось, что мне надо каждый раз пакет назад слать, что б клиент его получил, как в пинг понге. А можно не по одному байту за раз пересылать? Оптимальное есть значение?
import socket
import Rscan
def imag(x):
    text = Rscan.ima(x)
    #print text
    text = text.replace("\n"," ")
    print text
    return text
host = "localhost"
port = 44444
while True:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(1)
    conn, addr = s.accept()
    print addr
    dest = open('i.jpg', 'wb')
    while True:
        try:
            data = conn.recv(1024)
            conn.send('ok')
            dest.write(data)
        except: pass
        
        if data == 'not packet':
            print 'no'
            
            dest.close()
            res = imag('i.jpg')
            print res
            conn.send(res)
            print 'sending'
            conn.close()
            break
from socket import *
 
HOST = "localhost"
PORT = 44444
s = socket(AF_INET,SOCK_STREAM)
s.connect((HOST, PORT))
print "Client running on %s port %s" % (HOST, PORT)
fil = open("eurotext.jpg", "rb")
#s.settimeout(0.13)
while True:
        buf = fil.read(1024)
        if not buf :
                s.send('not packet')
                result = s.recv(1024)
                print result
                
                result = s.recv(1024)
                print result
                break
        s.send(buf)
        result = s.recv(1024)
        
s.close()
py.user.next
короче, рано те ещё серверы писать, потому что вот

sanodin
как в пинг понге
да, как в пинг-понге, только там должны быть конечные автоматы
такой цикл, который переходит то в одно состояние, то в вдругое, то в третье
в каждом состоянии свой набор действий
sanodin
В общем лучше написать класс в котором реализовать конечный автомат, понял, спасибо.
Типа такого http://pi-code.blogspot.com/2009/01/11.html
Хотя можно и без класса.
ocelot145
Привет всем. Вчера наша фирма затеяла переезд из Подмосковья в Москву, всё в принципе перевезли, остались серваки. Искал хорошую компании по грузоперевозкам, чтобы довезли всё в целости и сохранности. Наткнулся на эту грузоперевозки по Москве слышал кто нибудь?
Budulianin
ocelot145

Тему попутал?
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