1

Linux 上のローカル。20k メッセージで約 10 秒です。私の推測では、私の Java は悪く、Python は問題ありません。

py クライアント:

def scan(self, msg):
    try:
        print 'begin scan'
        HOST = 'localhost'
        PORT = 33000
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT));
        s.sendall(msg)
        data = s.recv(1024)
        s.close()
        print 'Received', repr(data)
    except Exception, e:
        print "error: " + str(e)

Java サーバー:

    ServerSocket service = new ServerSocket(33000); 

    while(true) {

    debug("Begin waiting for connection");

    //this spins
    Socket connection = service.accept();

    debug("Connection received from " + connection.getInetAddress().getHostName());

    OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
    BufferedInputStream in = new BufferedInputStream(connection.getInputStream());


    ScanResultsHeader results = new ScanResultsHeader();

        Scanner scanner = new Scanner();
        results = scanner.scan("scannerfake@gmail.com", "123", in);

public Sc​​anResultsHeader スキャン (文字列 userEmail、文字列 imapRetrievalId、BufferedInputStream mimeEmail) は、IOException、FileNotFoundException、MimeException、ScannerException {

    //how fast would it be to just slurp up stream?
    debug("slurp!");
    String slurp = IOUtils.toString(mimeEmail);
    debug("slurped " + slurp.length() + " characters");
    slurp = slurp.toLowerCase();
    debug("lc'ed it");
    //...

私の推測では、入力ストリームを間違ってジャグリングしています。1 つのキャッチは、"BufferedInputStream mimeEmail" 署名が API スキャンが使用しているライブラリに必要であるため、最終的にはそのフォームに到達する必要があることです。しかし、文字列を丸呑みするという単純な行為にばかげたほど時間がかかることに気付いたので、すでに何か間違ったことをしています。

4

2 に答える 2

0

私の答えを修正する...

あなたが効率的に読んでいて、あなたがそうであるように見えるならば、それはどちらかのために多くの時間しかかからないでしょう

  • 非常に高額になる可能性のあるメッセージを送信するたびに、新しい接続を作成しています。
  • 思ったほど速くデータを送信していません。
  • メッセージは非常に大きいです(可能性は低いですが、可能性があります)

これを行う方法についてはたくさんの例があり、使用できる優れたライブラリはIOUtilsであり、これにより簡単になります。

Javaの単一のソケットを介して約200K/sのメッセージを送信できるはずです。


ビッグエンディアンを使用した送信Xバイトプロトコルがある場合は、これを行うことができます。

DataInputStream dis = new DataInputStream( ...
int len = dis.readInt();
byte[] bytes = new byte[len];
dis.readFully(bytes);
String text = new String(bytes, "UTF-8");
于 2012-04-18T18:55:24.397 に答える
0

元の問題は、クライアントが入力の終わりを送信していないため、「slurp」操作が接続を横切る追加のデータを待機し続けることでした。

解決策は、メッセージのサイズを事前に送信するアプリケーション層プロトコルを実装し、そのバイト数の後にそれ以上のメッセージのリッスンを停止することでした。私は標準ライブラリを好んでいました.FiniteInputStreamはBufferedInputStreamを拡張し、サイズを引数として取りますが、私自身のものを書きました。

于 2012-04-19T18:16:29.677 に答える