2012-12-12 26 views
5

I Dart istemci/sunucu üzerinde birkaç güzel öğreticiler bulduk. İstemci, belirtilen bağlantı noktasında localhost aracılığıyla sunucuya istekte bulunur ve sunucu yalnızca bir String ile yanıt verir.İstemci Sunucu Dart

Ancak, resimlerin yayınlanması konusunda herhangi bir yardım bulamadık. Sunucuyu sunucuya istemciye gönderebilmek istiyorum. Örneğin, istemci localhost: 1313/Images gibi bir istek yaparsa, sunucu "görüntüler" klasöründeki tüm görüntüleri gösteren bir sayfa ile yanıt vermelidir. İşte

var bugüne kadar kodudur:

import 'dart:io'; 

class Server { 

_send404(HttpResponse res){ 
    res.statusCode = HttpStatus.NOT_FOUND; 
    res.outputStream.close(); 
} 


void startServer(String mainPath){ 
HttpServer server = new HttpServer(); 
server.listen('localhost', 1111); 
print("Server listening on localhost, port 1111"); 

server.defaultRequestHandler = (var req, var res) { 
    final String path = req.path == '/' ? '/index.html' : req.path; 
    final File file = new File('${mainPath}${path}'); 

    file.exists().then((bool found) { 
    if(found) { 
     file.fullPath().then((String fullPath) { 
     if(!fullPath.startsWith(mainPath)) {    
      _send404(res); 
     } else { 
      file.openInputStream().pipe(res.outputStream); 
     } 
     }); 
    } else { 
     _send404(res); 
    } 
    }); 
}; 


void main(){ 
Server server = new Server(); 
File f = new File(new Options().script); 
f.directory().then((Directory directory) { 
server.startServer(directory.path); 
}); 
} 

Henüz müşteri uygulanmadı, ancak bu bir istemci uygulamak gereklidir? Tarayıcı müşteri olarak yeterli değil mi? Ayrıca

, ne sunucu görüntüleri hizmet sağlamak için ne gerekiyor?

+0

Bu nedenle görüntü dosya adlarının veya görüntülerin kendilerinin bir listesini görüntülemek mi istiyorsunuz? İkincisi için, bir çeşit HTML şablonu yapmanız gerekir. – tjameson

cevap

1

düzgün hizmet verebilmek için görüntüleri, üzerinde Content-Type başlığı ayarlamak için ihtiyacımız olacak. Bunun dışında, sahip olduğunuz kod, dosyalara zaten hizmet verebileceğinden doğru yönde ilerliyor. Öte yandan, Apache veya Nginx kullanımı daha kolay olabilir ve ardından Dart sunucusuna bir ters proxy kurabilir. Bu şekilde Apache veya Nginx sizin için statik dosyalar sunabilir. Üzgünüz, henüz belgelendirilmemiş durumdayız. Ayrıca, Heroku'nun sizin için uygun olabileceğini merak ediyorum.

+0

Cevabınız için teşekkür ederiz. Bir html sayfası yaptık, ama bu alışkanlık gerçekten söylemek yok. Bu, tek bir görüntüye referans yapar, ancak sunucudaki tüm görüntülerin görüntülenmesini istiyorum. Bu, her görüntü için dinamik olarak 'img src = "" ile div/span oluşturmak zorunda olduğum anlamına mı geliyor? Orada benim tüm html sayfa kodunda için yer yoktur, ancak kabaca şöyle görünür:

Excercise4


ben hem istemci ve sunucu için dart kullanmak zorundadır. Sunucu sadece yerel olarak – AomSet

+0

Bu, genel olarak HTML'de olduğu gibi Dart'ta da aynıdır. Her görüntü için etiketli bazı HTML’lere sahip olmanız gerekir. Apache'yi kullandığınız zaman.Bu web sunucuları sizin için bu HTML sayfalarını oluşturabilir. Bir Dart sunucusuyla gerçekten uğraşmak isterseniz, bir dizindeki resimlerin üzerine döngü yapmak için bir kod yazmalı ve her görüntü için etiketli bir HTML sayfası oluşturmalısınız. –

5

Kodunuzu yapıştırdım (ve biraz değiştirdim, sanırım birkaç yazım hatası var) ve şu anda kromda görüntüler sunuyor - şu anda görüntünün tam URL'sini iletmeniz gerekiyor, örneğin: http://localhost:1111/images/foo.png

görüntülerin bulunduğu bir sayfa almak için, bir html sayfası, örneğin yazmak gerekir ya:

<html><body> 
    <img src="http://localhost:1111/images/foo.png"/> 
    <img src="http://localhost:1111/images/bar.png"/> 
</body></html> 

Ve sunucuda dinamik olduğunu html oluşturamadı hiçbir neden için, var Örneğin, örneğin images.html adlı bir dosya için yapılan bir isteğe yanıt olarak. Sunucu tarafında dosya ve klasörleri yinelemek için DirectoryLister sınıfına bir göz atın. Ayrıca

, JJ'in açıklama da doğrudur - (krom uygun başlıkları olmadan şeyler yorumlama de oldukça iyi görünüyor olsa da) aynı zamanda, uygun başlıklar eklemek gerekir.

Referans için, burada benim için iyi çalışan sunucu tarafı kodu (sadece bunu test edebilmem için ... - 404 ve seçenekleri kaldırılmış - geçerli (yani, uygulamanın kendi) klasöründen).

import 'dart:io'; 

void startServer(String mainPath){ 
    HttpServer server = new HttpServer(); 
    server.listen('127.0.0.1', 1111); 
    print("Server listening on localhost, port 1111"); 

    server.defaultRequestHandler = (var req, var res) { 
    final String path = req.path == '/' ? '/index.html' : req.path; 
    final File file = new File('${mainPath}${path}'); 

    file.exists().then((bool found) { 
     if(found) { 
     file.fullPath().then((String fullPath) { 
      file.openInputStream().pipe(res.outputStream); 
     }); 
     } 
    });  
    }; 
} 

main(){ 
    startServer("."); 
} 
İlgili konular