我正在尝试将我的 android 手机用作打印机。我正在使用 ServerSocket 接收要打印的文档。如果我通过提供 IP 地址和端口将我的手机添加为 IP 打印机并选择通用 Postscript 打印机,我能够正确接收 ps 格式的文件。我不想将我的手机添加为打印机作为 IP 打印机。所以现在我正在使用 NsdManager 将我的设备注册为打印机。它会自动识别为 Bonjour 打印机,我可以成功添加为打印机。但是现在每次我从计算机打印文档时,我都会在套接字的输入流中获取这些数据。
POST / HTTP/1.1 Content-Length: 673 Content-Type: application/ipp Host:
Android-2.local:9200 User-Agent: CUPS/2.1.0 (Darwin 15.2.0; x86_64)
IPP/2.0 Expect: 100-continue Gattributes-charsetutf-8Hattributes-
natural-languageen-usEprinter-uriipp://Android-
2.local.:9200/Drequested-attributescompression-supportedDcopies-
supportedDcups-versionDdocument-format-supportedD marker-colorsDmarker-
high-levelsD marker-levelsDmarker-low-levelsDmarker-messageDmarker-
namesDmarker-typesDmedia-col-supportedD$multiple-document-handling-
supportedDoperations-supportedDprint-color-mode-supportedD printer-
alertDprinter-alert-descriptionDprinter-is-accepting-jobsD printer-
mandatory-job-attributesD printer-stateDprinter-state-messageDprinter-
state-reasons
我阅读了 IPP 文档,并在响应中发送了 100 Continue 以及所有像这样的必需参数
clientSocket.setTcpNoDelay(true);
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
out.write("HTTP/1.1 100\r\n".getBytes("UTF-8"));
out.write("\r\n".getBytes("UTF-8"));
out.write("compression-supported: \"none\"\r\n".getBytes("UTF-8"));
out.write("printer-is-accepting-jobs: \"true\"\r\n".getBytes("UTF-8"));
.....
....
out.flush();
之后,如果我尝试读取文档的输入流,它会给出 null 并且在我的计算机上我收到消息“打印:已连接到打印机”但如果执行 out.close(); 在关闭套接字的输出流时,我在计算机上收到消息“无法获取打印机状态”。请帮我。有什么方法我只是收到文件而不是这个帖子请求或发送正确响应并获取文件的方法?我已经坚持了很长时间了。非常感谢任何帮助。