【问题标题】:Socket - Bad OutputStream output (Funky Question Marks)套接字 - 错误的 OutputStream 输出(时髦的问号)
【发布时间】:2013-12-08 00:33:53
【问题描述】:

使用下面的代码,我不会在控制台上打印“daSHI”。 相反,我得到“??????”打印。

为了测试,我没有使用套接字的输入/输出流,而是创建了一个 FileInputStream 和 FileOutputStream 从同一个文件写入/读取,并且“daSHI”打印得很好。

但是,当我使用 sock.getOutputStream 和 sock.getInputStream 时,由于某种原因它不起作用。我得到的只是问号。有任何想法吗?编码问题?

public void sendMessage(Socket sock) throws KVException {

    OutputStream outStream;
    InputStream inStream;

    try{

        byte[] b = {'d', 'a', 'S', 'H', 'I'};
        outStream = sock.getOutputStream();

        outStream.write(b);
        sock.shutdownOutput();



        inStream = sock.getInputStream();

        for (int i = 0; i < b.length; i++) {
            System.out.print("" + (char) inStream.read());
         }

    }
    catch(IOException e){
        KVMessage errorMessage = new KVMessage("resp", "Network Error: Could not send data");
        throw new KVException(errorMessage);
    }
}

【问题讨论】:

  • 这是一个环回套接字连接吗?您还没有显示套接字如何连接到另一端。另一端与数据相呼应的是什么?
  • 随机猜测:输入流在 EOF,也就是 -1 的 5 倍。省略 (char) 进行验证。为什么?取决于您的服务器...您是否尝试添加 outStream.flush() 并仅在从输入中读取数据后关闭套接字?
  • 您的socket InputStream 与OutputStream 不同。那么,您为什么希望数据回显呢?
  • 我通过 'new Socket("localhost", 'portnumber') 创建了一个套接字,然后我如何能够通过输入流发送内容并让某些接收者获取该输入?显然,我想错了。
  • @StefanHaustein 喜欢在 .write() 和 .shutdownOutput() 之后添加 .flush() 吗?当我这样做时,它似乎只是挂起。我在here 上读到,套接字一直读取到 EOF,直到我关闭套接字才能得到。因此,我必须在阅读之前关闭它?

标签: java sockets inputstream outputstream


【解决方案1】:

除非您连接到回显服务器或同一应用程序的另一个副本,否则套接字不会以这种方式工作:您不能期望阅读您所写的内容,因为您正在阅读的是远端的内容套接字正在发送。

很可能,这里的原因是输入流已经到达 EOF 并且read() 返回 -1。 -1 在转换为 char 时变为 zigamorph,并且打印此无效字符会生成 ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2017-06-23
    • 2012-07-07
    相关资源
    最近更新 更多