java socket 打印机_socket.BeginReceive()使打印机无响应

在开发一个使用Java Socket自动打印PDF并监控打印机状态的应用时,遇到问题:当代码执行到socket.BeginReceive()时,打印机停止接收来自任何工作站的打印作业。关闭应用程序或套接字后,打印机恢复正常。问题可能与阻塞/非阻塞或同步/异步套接字有关。尝试寻找解决方案以允许接收打印机的未经请求消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我一直在开发一个应用程序,它可以在到达时自动在特定网络打印机上打印PDF文件并监控 @PJL USTATUS JOB 消息 . 但是,每当我开始我的应用程序并且代码命中 socket.BeginReceive() 时,打印机就无法从任何工作站接收任何打印作业,这也意味着永远不会调用回调 . 但是,如果我关闭我的应用程序或仅关闭套接字,打印机将再次开始工作 .

我错过了什么吗?像阻塞/非阻塞或同步或异步套接字?

public class SocketData {

public Socket socket;

public byte[] dataBuffer = new byte[1024];

}

public void Start() {

// start the thread that checks the printer status

thread = new Thread(new ThreadStart(ConnectAndListen));

thread.Priority = ThreadPriority.Lowest;

thread.Start();

// start the file listener

listener = new FileSystemWatcher(this.WatchPath);

listener.Created += new FileSystemEventHandler(listener_Created);

listener.EnableRaisingEvents = true;

}

public void ConnectAndListen() {

ipEndPoint = new IPEndPoint(Dns.GetHostEntry(this.IPAddress).AddressList[0], 9100);

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.Connect(ipEndPoint);

//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS DEVICE = ON\r\n\x1B%-12345X\r\n"));

//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS JOB = ON\r\n\x1B%-12345X\r\n"));

socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS PAGE = ON\r\n\x1B%-12345X\r\n"));

//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS TIMED = 0\r\n\x1B%-12345X\r\n"));

ListenForPrinterReadBack(socket);

}

public void ListenForPrinterReadBack(Socket socket) {

if (DataRecievedCallBack == null) {

DataRecievedCallBack = new AsyncCallback(OnDataReceived);

}

SocketData socketData = new SocketData();

socketData.socket = socket;

m_asynResult = socket.BeginReceive(socketData.dataBuffer, 0, socketData.dataBuffer.Length, SocketFlags.None, DataRecievedCallBack, socketData);

}

public void OnDataReceived(IAsyncResult asyn) {

SocketData socketData = (SocketData)asyn.AsyncState;

int result = socketData.socket.EndReceive(asyn);

char[] chars = new char[result + 1];

Decoder d = Encoding.UTF8.GetDecoder(); //creating object for decoding

int charLen = d.GetChars(socketData.dataBuffer, 0, result, chars, 0);

String recievedData = new String(chars);

this.Status = recievedData;

ListenForPrinterReadBack(socketData.socket);

}

我知道我可以进行民意调查,但我无法收到未经请求的打印机消息 .

提前致谢!

UPDATE: 我感觉打印机上只允许一个套接字连接 . 由于 socket.BeginReceive() 只能在连接套接字时才能工作,因此套接字已被使用,因此无法发送任何其他请求 . 也许有另一种方法来处理未经请求的打印机回读?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值