C# WebApplication通过套接字与Windows应用程序通信

C# WebApplication通过套接字与Windows应用程序通信,c#,sockets,C#,Sockets,计算机和服务器之间的套接字通信有问题。发生的情况是,只有在单击特定按钮时,我才能通过套接字建立通信。在第一次交流中,一切都会完美地发生。如果我再次单击,代码将不会执行。我放置了一个断点来查看发生了什么,并在尝试连接到服务器时看到发生了以下错误 无法访问已释放的对象。对象名称:“System.Net.Sockets.TcpClient”。 因此,为了再次工作,我关闭客户端应用程序并再次打开,然后正常工作 我想要什么 我有一个只在FireFox上工作的web应用程序。我有一台打印机,我需要通过DLL

计算机和服务器之间的套接字通信有问题。发生的情况是,只有在单击特定按钮时,我才能通过套接字建立通信。在第一次交流中,一切都会完美地发生。如果我再次单击,代码将不会执行。我放置了一个断点来查看发生了什么,并在尝试连接到服务器时看到发生了以下错误

无法访问已释放的对象。对象名称:“System.Net.Sockets.TcpClient”。

因此,为了再次工作,我关闭客户端应用程序并再次打开,然后正常工作

我想要什么 我有一个只在FireFox上工作的web应用程序。我有一台打印机,我需要通过DLL访问他,所以我制作了一个客户端应用程序,通过套接字与这个Web应用程序连接。我通过流传递一些参数,并在客户端应用程序中恢复这些参数,然后打印

在我的Web应用程序代码中

public void btnImprimeBematech_Venda()
        {            
            Utilidade.QuebraToken tk = new Utilidade.QuebraToken();
            int Credenciada = Convert.ToInt32(tk.CarregaToken(1, HttpContext.Current.Request.Cookies["token"].Value));
            TcpListener serverSocket = new TcpListener(8852);            
            int requestCount = 0;
            TcpClient clientSocket = default(TcpClient);
            serverSocket.Start();

            while (true)
            {
                clientSocket = serverSocket.AcceptTcpClient();

                requestCount = 0;

                while (clientSocket.Connected == true)
                {
                    try
                    {
                        requestCount = requestCount + 1;
                        NetworkStream networkStream = clientSocket.GetStream();
                        string serverResponse = Request.QueryString["id"].ToString() + ";" + Credenciada.ToString() + ".";
                        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                        networkStream.Write(sendBytes, 0, sendBytes.Length);
                        networkStream.Flush();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

            clientSocket.Close();
            serverSocket.Stop();
        }
`System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();`

private void Form1_Load(object sender, EventArgs e)
    {
        clientSocket.Connect("server_ip", 8852);
        this.imprimir();
    }

private void button3_click(object sender, EventArgs e)
{
    if (clientSocket.Connected == false)
        clientSocket.Connect("server_ip", 8852);            

    this.imprimir();
}

protected void imprimir()
{            
    NetworkStream serverStream = clientSocket.GetStream();
    byte[] inStream = new byte[10025];
    serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
    string returndata = System.Text.Encoding.ASCII.GetString(inStream);
    int ponto = returndata.IndexOf('.');
    returndata = returndata.Substring(0, ponto);
    string[] quebraretorno = returndata.Split(';');

    ServiceReference1.bematechSoapClient bema = new ServiceReference1.bematechSoapClient();            
    string r = bema.InformacoesImovelBematech(quebraretorno[0], quebraretorno[1]);
    int retorno = -1;

    retorno = IniciaPorta("COM7");         

    if (retorno == 1)
    {
        ConfiguraModeloImpressora(7);
        BematechTX(r);
        AcionaGuilhotina(1);
        FechaPorta();
    }

    clientSocket.Close();
}
我通过流传递一个字符串,并在客户端应用程序中恢复

客户端应用程序代码

public void btnImprimeBematech_Venda()
        {            
            Utilidade.QuebraToken tk = new Utilidade.QuebraToken();
            int Credenciada = Convert.ToInt32(tk.CarregaToken(1, HttpContext.Current.Request.Cookies["token"].Value));
            TcpListener serverSocket = new TcpListener(8852);            
            int requestCount = 0;
            TcpClient clientSocket = default(TcpClient);
            serverSocket.Start();

            while (true)
            {
                clientSocket = serverSocket.AcceptTcpClient();

                requestCount = 0;

                while (clientSocket.Connected == true)
                {
                    try
                    {
                        requestCount = requestCount + 1;
                        NetworkStream networkStream = clientSocket.GetStream();
                        string serverResponse = Request.QueryString["id"].ToString() + ";" + Credenciada.ToString() + ".";
                        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                        networkStream.Write(sendBytes, 0, sendBytes.Length);
                        networkStream.Flush();
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

            clientSocket.Close();
            serverSocket.Stop();
        }
`System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();`

private void Form1_Load(object sender, EventArgs e)
    {
        clientSocket.Connect("server_ip", 8852);
        this.imprimir();
    }

private void button3_click(object sender, EventArgs e)
{
    if (clientSocket.Connected == false)
        clientSocket.Connect("server_ip", 8852);            

    this.imprimir();
}

protected void imprimir()
{            
    NetworkStream serverStream = clientSocket.GetStream();
    byte[] inStream = new byte[10025];
    serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
    string returndata = System.Text.Encoding.ASCII.GetString(inStream);
    int ponto = returndata.IndexOf('.');
    returndata = returndata.Substring(0, ponto);
    string[] quebraretorno = returndata.Split(';');

    ServiceReference1.bematechSoapClient bema = new ServiceReference1.bematechSoapClient();            
    string r = bema.InformacoesImovelBematech(quebraretorno[0], quebraretorno[1]);
    int retorno = -1;

    retorno = IniciaPorta("COM7");         

    if (retorno == 1)
    {
        ConfiguraModeloImpressora(7);
        BematechTX(r);
        AcionaGuilhotina(1);
        FechaPorta();
    }

    clientSocket.Close();
}
每次我的用户单击我的Web应用程序上的特定按钮时,我都需要它,调用我的
btnImprimeBematech\u Venda()
,然后与我的客户端应用程序对话打印。现在,每当我的用户点击我的按钮打印时,我都需要关闭客户端应用程序并再次打开

我对
线程不太了解,但也许我需要使用它。我不知道


有人能帮我吗?

我想你的问题是客户端应用程序末尾的
Close()
调用。Close将释放与解释dispose异常的套接字关联的所有资源。尝试使用
Shutdown
,然后使用
Disconnect(true)
,这样可以重复使用您的套接字。参见msdn文档

或者,您可以保持关闭状态,并在每次连接时创建一个新的套接字