5

Dart のクライアント/サーバーに関するいくつかの優れたチュートリアルを見つけました。クライアントは、指定されたポートで localhost を介してサーバーに要求を送信するだけで、サーバーは文字列で応答するだけです。

ただし、画像を提供する方法については何の助けも見つかりませんでした。サーバーからサーバーへのイメージをクライアントに取得できるようにしたい。たとえば、クライアントが localhost:1313/Images のような要求を行う場合、サーバーは「images」フォルダーにあるすべての画像を表示するページで応答する必要があります。

これが私がこれまでに持っているコードです:

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);
});
}

まだクライアントを実装していませんが、クライアントを実装する必要はありますか? ブラウザはクライアントとして十分ではありませんか?

また、サーバーに画像を提供させるにはどうすればよいですか?

4

2 に答える 2

5

私はあなたのコードを貼り付けました(そして少し編集しました。タイプミスがいくつかあると思います)。クロムで画像を提供します-現在、画像の完全なURLを渡す必要があります。例:http://localhost:1111/images/foo.png

画像でいっぱいのページを取得するには、次のような html ページを作成する必要があります。

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

たとえば、たとえばと呼ばれるファイルの要求に応答して、サーバー上でその html を動的に作成できなかった理由はありませんimages.htmlDirectoryListerサーバー側でファイルとフォルダーを反復するクラスを見てください。

また、JJ のコメントも正しいです。適切なヘッダーも追加する必要があります (ただし、chrome は適切なヘッダーがなくても内容を解釈するのが得意なようです)。

参考までに、これは私にとって問題なく機能するサーバー側のコードです(テストできるようにするためです...-404とオプションが削除されています-現在の(つまり、アプリ自体の)フォルダーから提供されます)。

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(".");  
}
于 2012-12-13T01:56:41.977 に答える
1

To properly serve images, you're going to need to set a Content-Type header. Other than that, the code you have is going in the right direction because it can already serve files. On the other hand, it might be easier to use Apache or Nginx and then setup a reverse proxy to the Dart server. That way Apache or Nginx can serve static files for you. Sorry, we don't yet have all of this documented yet. I also wonder if using Heroku might be a good fit for you.

于 2012-12-12T23:31:49.853 に答える