Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCPClient:无法建立连接,因为目标计算机主动拒绝它_C#_Sockets_Tcpclient_Zebra Printers - Fatal编程技术网

C# TCPClient:无法建立连接,因为目标计算机主动拒绝它

C# TCPClient:无法建立连接,因为目标计算机主动拒绝它,c#,sockets,tcpclient,zebra-printers,C#,Sockets,Tcpclient,Zebra Printers,试图将网络流写入套接字,但出现以下错误: No connection could be made because the target machine actively refused it 应用程序有一个并发的打印作业列表,所以当我们有一些东西要打印时,检查tcp客户端是否已连接,如果未连接,则获取流、写入流和刷新 示例代码如下所示: /// <summary> Print via TCP </summary> private void PrintViaTcp(obj

试图将网络流写入套接字,但出现以下错误:

No connection could be made because the target machine actively refused it
应用程序有一个并发的打印作业列表,所以当我们有一些东西要打印时,检查tcp客户端是否已连接,如果未连接,则获取流、写入流和刷新

示例代码如下所示:

/// <summary> Print via TCP </summary>
private void PrintViaTcp(object a)
{
    Debug.WriteLine($"Printing via TCP...");
    var labelData = a as LabelData;            

    // Send data to the label printer
    SendToLabelPrinter(labelData.Commands, labelData.PrinterAddress, labelData.Port);

    Debug.WriteLine(" -> Printed labelId : {0}", labelData.LabelId);
}

/// <summary> Send the native command to the label printer </summary>        
public void SendToLabelPrinter(string commands, string address, int? port)
{                        
    //Connect to tcp client if a connection does not exist
    if (!TcpClient.Connected) TcpClient.Connect(address, port ?? 9100);

    //Get the network stream
    var stream = TcpClient.GetStream();

    // Send command strings to printer
    //stream.Write(Encoding.ASCII.GetBytes(commands), 0, commands.Length);
    stream.Write(Encoding.GetEncoding(850).GetBytes(commands), 0, commands.Length);

    //Flush the buffer on the network stream
    stream.Flush();           
}
///通过TCP打印
私有void PrintViaTcp(对象a)
{
Debug.WriteLine($“通过TCP打印…”);
var labelData=a作为labelData;
//将数据发送到标签打印机
SendToLabelPrinter(labelData.Commands、labelData.PrinterAddress、labelData.Port);
Debug.WriteLine(“->打印的labelId:{0}”,labelData.labelId);
}
///将本机命令发送到标签打印机
public void sendtolablprinter(字符串命令、字符串地址、int?端口)
{                        
//如果连接不存在,请连接到tcp客户端
如果(!TcpClient.Connected)TcpClient.Connect(地址,端口?9100);
//获取网络流
var stream=TcpClient.GetStream();
//将命令字符串发送到打印机
//stream.Write(Encoding.ASCII.GetBytes(commands),0,commands.Length);
stream.Write(Encoding.GetEncoding(850).GetBytes(commands),0,commands.Length);
//刷新网络流上的缓冲区
stream.Flush();
}

这适用于小型打印作业<100个打印,但当我超过100个打印时,错误会随机出现缺少的打印。

分析和查找随机出现的TCP或网络问题的根本原因的最佳方法是开始查看Wireshark,它可以提供更多关于发送内容以及其间如何拒绝连接的信息

同样在您的代码中,TCPClient上没有超时设置。当发送或接收更多数据量时,请尝试设置更高的
**超时**
设置。。这可能是问题所在。再次使用wireshark,您将了解连接是如何关闭的以及是谁发起的所有细节。。只需寻找鳍旗


网络堆栈一次可以处理一个连接,并且可以在开始拒绝连接之前将8个左右的连接排队。如果您向它发送了许多单独的连接请求,则需要说明拒绝的原因,并在打印机能够处理该请求之前退出

另一个选项是创建一个将所有打印作业发送到的打印处理程序

当第一个请求打开连接到打印机时。 当新请求进来时,将它们添加到队列中。
如果一分钟内未使用连接,请关闭连接。

这似乎是并发问题。您应该检查打印机服务器可以处理多少并发作业