0

我的服务器中有一种服务架构,侦听 TCP-IP-socked。

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(...)”方法。但是,该服务没有收到任何消息,因为字节丢失并且协议正在相互等待。

我的猜测是搜索服务需要太长时间,同时消息丢失。

重要信息:有时它工作有时不工作。客户端和服务器在同一台电脑上运行,这可能是线程问题。

客户端协议:

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 回答