【问题标题】:Service-architecture - the inputStream is losing bytes服务架构 - inputStream 正在丢失字节
【发布时间】:2012-06-18 18:28:27
【问题描述】:

我的服务器中有一种服务架构,监听 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());

架构有什么问题?

非常感谢!

【问题讨论】:

    标签: java inputstream outputstream


    【解决方案1】:

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

    如果是这样,那么您需要修复您在套接字上请求流的顺序,您需要首先从套接字获取 inputStream,然后请求 outputStream,否则您将结束线程阻塞并等待数据。

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

    完整的解释请参考这篇文章:Stackoverflow java socket question。

    【讨论】:

    • 线程太重要了。一个是客户端,一个是服务器。如果等待数据,每个都会阻塞。流像这样存储在服务器中public ProtocolHandler(Socket socket) throws IOException { this.socket = socket; this.outputStream = socket.getOutputStream(); this.inputStream = socket.getInputStream(); }
    • 您必须按照我添加的链接中的说明匹配订单,祝您好运:)
    • 顺序对了!我发现了问题!这是一个阅读问题:(
    【解决方案2】:

    问题解决了!我有一个阅读问题...“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;
        }
    

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2017-08-21
      • 2016-09-02
      • 1970-01-01
      • 2011-07-26
      • 2012-08-27
      相关资源
      最近更新 更多