服务架构 - inputStream正在丢失字节

时间:2012-05-03 15:19:41

标签: java inputstream outputstream

我的服务器中有一种服务架构,可以监听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(...)”方法。但是,该服务没有消息,因为字节丢失且协议正在等待彼此。

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

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

客户端协议:

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

服务器服务协议:

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

架构中有什么问题?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这是一个疯狂的猜测,但它可能是你的问题。您的线程是否被阻止并等待数据?

如果是这样,那么你需要修改你在套接字上要求流的顺序,你需要从套接字获取FIRST的inputStream,然后请求outputStream,否则你最终会线程被阻塞并等待数据。

我希望这能解决你的问题。

请参阅此帖子:Stackoverflow java socket question以获取完整说明。

答案 1 :(得分:0)


问题解决了!我有一个阅读探测器......“总计+ = bRead;”失踪了....

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