通过 Java 中的套接字发送打印机命令

Posted

技术标签:

【中文标题】通过 Java 中的套接字发送打印机命令【英文标题】:Send printer commands via socket in Java 【发布时间】:2015-04-06 13:50:50 【问题描述】:

我正在尝试通过套接字向卡片打印机发送命令,但我无法使其工作。现在,我有一个用 php 开发的程序,它正在运行,但我需要让它在 Java 中运行。 PHP中的程序是这样的:

$ESC = chr(27); //Ascii character for Escape
$CR = chr(13); // Ascii character for Carriage Return
$cmd =  $ESC .  $command .  $CR;
socket_send($socket, $cmd, strlen($cmd), 0);
socket_recv($socket, $respuesta, strlen($respuesta), 0);

在 Java 中,我正在制作这样的东西

char ESC = (char)27; //Ascii character for Escape
char CR = (char) 13; //Ascii character for Carriage Return
//////////////
Socket socket = null;
DataInputStream input = null;
DataOutputStream output = null;
// I make another stuff here
socket = new Socket(address,port);
input = new DataInputStream (socket.getInputStream()); 
output  = new DataOutputStream (socket.getOutputStream());
//I make another stuff here
if (socket != null && input != null && output != null)
            
                try
                
                    String cmd=ESC+command+CR;
                    byte[] message = cmd.getBytes();              
                    output.writeShort(cmd.length());                                     
                    output.writeBytes(cmd);

                    message = new byte[input.readShort()];                            
                    input.readFully(message);                                                       
                    response = new String(message);

                    salida.close();
                    entrada.close();
                    conec.close();
                
                catch (Exception e)
                
                    System.out.println(e.toString());

                
            

我尝试了不同类型的数据:int、UTF-8、long 等,但似乎不起作用。我不知道打印机是否需要更多信息,或者我发送的数据类型错误

让我总结一下:PHP 中的代码运行良好,但是当我尝试将该代码转换为 Java 并通过套接字将命令发送到打印机时,却根本无法运行。我已经阅读了手册,但完全没有帮助

P.D.打印机的品牌是 Evolis

P.D. 2 对不起,如果我没有很好地解释,但英语不是我的第一语言

提前致谢

【问题讨论】:

我不懂 PHP,但是 socket_send 和 socket_recv 实际上在消息本身之前写入和读取到套接字的消息长度吗?因为这就是您在 Java 中对 read/writeShort 调用所做的事情。 @HeinBlöd 根据 PHP 文档,socket_send (php.net/manual/en/function.socket-send.php) 将数据发送到连接的套接字,返回值是发送的字节数,或者错误时为 FALSE。而socket_recv(php.net/manual/en/function.socket-recv.php),从一个已连接的socket接收数据,返回值是接收到的字节数,如果有错误则为FALSE 是的,我尝试了其他类型的数据,除了short,但我没有接收设备的答复。我不知道是我发送的数据错误,还是期待其他类型的数据 您能否将打印机置于十六进制跟踪模式以查看实际到达的内容(如果有的话)? 那么在你的 Java 代码中 writeShort 和 readShort 是不是多余的......?消息长度显然不是打印机网络协议的一部分? @Duston 如何将打印机置于十六进制跟踪模式? 【参考方案1】:

我终于找到了解决办法。给大家分享一下吧

char ESC = (char)27; //Ascii character for ESCAPE
char CR = (char) 13; //Ascii character for Carriage Return
/////////////
Socket socket = null;
OutputStream output= null;
BufferedReader reader= null;
///////////
try
             
                socket = new Socket(address,port);
                socket.setSoTimeout(5000);
                output = socket.getOutputStream();
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            catch (UnknownHostException e) etc... 
/////////
if (socket != null  && output != null)
            
                try
                
                    String cmd=ESC+command+CR;
                    output.write(cmd.getBytes());
                    output.flush();
                    socket.shutdownOutput();

                    response = reader.readLine();

                     System.out.println(response.toString());

                    output.close();
                    socket.close();
                
                catch (Exception e)
                
                    System.out.println(e.toString());

                
            

这个解决方案的关键是方法socket.shutdownOutput();,因为我认为设备无法同时发送和接收数据,所以如果你想要一个响应设备,你必须先关闭输出(手册根本没有帮助,所以我现在猜)

感谢大家的帮助

【讨论】:

您介意分享您的 php 代码吗?对于近期的一个项目,我计划使用 evolis 打印机打印一些活动徽章(带有二维码/条形码)。我有一个包含访问者的数据库,并想给他们一个个人徽章,其中包含 vcard 数据或他们数据库数据的唯一密钥。所以每个参展商都可以得到他们的数据 我的情况是 "response" = null

以上是关于通过 Java 中的套接字发送打印机命令的主要内容,如果未能解决你的问题,请参考以下文章

如何通过套接字发送/接收二进制数据?

通过c中的套接字发送结构

无法通过 Java 中的套接字发送大文件

通过Java中的套接字发送字符串而不是字节

异步套接字延迟

如何通过 java 套接字发送 Json 对象?