我一直在开发一款应用程序,可在到达时自动在特定网络打印机上打印PDF文件,并监视@PJL USTATUS JOB
消息。但是,每当我开始我的应用程序并且代码点击socket.BeginReceive()
时,打印机都无法从任何工作站接收任何打印作业,这也意味着回调将永远不会被调用。但是,如果我关闭了我的应用程序或只是套接字,打印机再次开始工作。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%[email protected] USTATUS DEVICE = ON\r\n\x1B%-12345X\r\n"));
//socket.Send(Encoding.ASCII.GetBytes("\x1B%[email protected] USTATUS JOB = ON\r\n\x1B%-12345X\r\n"));
socket.Send(Encoding.ASCII.GetBytes("\x1B%[email protected] USTATUS PAGE = ON\r\n\x1B%-12345X\r\n"));
//socket.Send(Encoding.ASCII.GetBytes("\x1B%[email protected] 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);
}
我知道我可以做轮询,但是我不能接收未经请求的打印机信息。
在此先感谢!
更新: 我感觉只有一个套接字连接被允许在打印机上。由于socket.BeginReceive()
只能在套接字连接时起作用,因此套接字已被使用,所以无法发送任何其他请求。也许有另一种方法来处理未经请求的打印机回读?
由于'BeginReceive'不能影响另一端如何接收信息,所以你的问题是其他问题。向我们展示更多代码。 – jgauffin 2011-05-11 06:21:57
在那里,我更新了包含与套接字相关的方法的更多代码。顺便说一句,谢谢你的回应。 :) – arvil 2011-05-11 06:34:45