2011-05-11 142 views
0

我一直在开发一款应用程序,可在到达时自动在特定网络打印机上打印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()只能在套接字连接时起作用,因此套接字已被使用,所以无法发送任何其他请求。也许有另一种方法来处理未经请求的打印机回读?

+0

由于'BeginReceive'不能影响另一端如何接收信息,所以你的问题是其他问题。向我们展示更多代码。 – jgauffin 2011-05-11 06:21:57

+0

在那里,我更新了包含与套接字相关的方法的更多代码。顺便说一句,谢谢你的回应。 :) – arvil 2011-05-11 06:34:45

回答

0

是否Send报告所有字节已发送(检查它的返回值)?我无法发现任何会阻止对方收到您的消息的错误。你是否100%确定你发送的字符串是正确的?确保打印机是“双向”的模式,并尝试这种代码:

private void SendCommand(byte[] data, string ip, int port) 
    { 
     var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     socket.NoDelay = true; 

     var ipAddress = IPAddress.Parse(ip); 
     IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); 

     socket.Connect(remoteEP); 
     socket.Send(data); 
     socket.Close(); 
    } 

,它会工作好

+0

当我发送一个** @ PJL INFO STATUS **一个** socket.Receive()**返回数据。但是,如果我选择使用** socket.BeginReceive()**,则打印机会停止采取任何进一步的命令或打印作业。我真的很困惑自己。 – arvil 2011-05-11 07:26:06

+0

您是否尝试过将'@PJL INFO STATUS'与'socket.BeginReceive()'结合起来? – jgauffin 2011-05-11 07:29:14

+0

我还没有尝试过,因为'@PJL INFO STATUS'即时返回数据。我会试一试并保持发布。谢谢! – arvil 2011-05-11 09:07:33

0

喜用打印机

时首先我发现了同样的问题,因为你的。

最好的问候