0

私のサーバーには、TCP-IP ソケットでリッスンする一種のサービス アーキテクチャがあります。

messageType = protocolHandler.getMessageType();
ITaskProtocol serviceProtocol = serverServices.get(messageType);
if (p != null) {
    String result = serviceProtocol.handleTask(protocolHandler);
}

特定のタスクのプロトコルをハッシュマップに保存しています。私の問題は、タスクを処理する必要があるプロトコルがinputStreamでバイトを見つけられないことです。inputStream と socked は「protocolHandler」の中にあります。

例:

public class ProtocolHandler implements ITaskProtocolHandler {
    @Override
    public int getMessageType() throws IOException {
        return new DataInputStream(stream).readInt();
    }

ただし、(デバッグのため) メッセージが送信されたことがわかります。また、プロトコル (サービス) がマップで見つかり、サービスの「handleTask(...)」メソッドが呼び出されました。ただし、バイトが失われ、プロトコルが相互に待機しているため、サービスはメッセージを受け取りません。

私の推測では、サービスの検索に時間がかかりすぎて、その間にメッセージが失われていると思われます。

重要な情報: 機能している場合もあれば、機能していない場合もあります。クライアントとサーバーが同じ PC で実行されている場合、おそらくスレッドの問題です。

クライアント プロトコル:

clientWorker.send(ServerProtocol.MessageRequestType.JoinTopicRequest.getRequestNumber());
clientWorker.send("some xml-message");

サーバー サービス プロトコル:

public String handleTask(ITaskProtocolHandler protocolHandler) throws Exception {
    Message m = protocolHandler.getMessage());

アーキテクチャの何が問題になっていますか?

どうもありがとう!

4

2 に答える 2

1

これは大雑把な推測ですが、あなたの問題かもしれません。スレッドがブロックされ、データを待機していますか?

その場合、ソケットでストリームを要求する順序を修正する必要があります。最初にソケットからinputStreamを取得してから、outputStreamを要求する必要があります。そうしないと、スレッドがブロックされてしまいますそしてデータ待ち。

これで問題が解決することを願っています。

完全な説明については、この投稿を参照してください: Stackoverflow Java socket question 。

于 2012-05-03T15:29:39.933 に答える
0

問題が解決しました!読み取りの問題がありました...「totalRead += nRead;」行方不明だった……

    int size = readInt();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int nRead = 0;
    int totalRead = 0;
    byte[] data = new byte[1024];

    while (totalRead < size) {
        int read;
        if (data.length <= (size - totalRead))
            read = data.length;
        else
            read = (size - totalRead);
        if ((nRead = inputStream.read(data, 0, read)) == -1)
            throw new IOException("End of stream");
        buffer.write(data, 0, nRead);
        totalRead += nRead;
    }
于 2012-06-18T10:28:27.833 に答える