通过 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 中的套接字发送打印机命令的主要内容,如果未能解决你的问题,请参考以下文章