【发布时间】: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 如何将打印机置于十六进制跟踪模式?