2012-10-25 156 views
0

我在计算机和服务器之间的套接字通信有问题。发生什么事是我只通过点击一个特定的按钮来建立通过套接字的通信。在第一次沟通中,一切都完美无缺。如果再次点击,代码不会被执行。我把一个断点,看看发生了什么,看到了,当我尝试连接到服务器通过套接字与Windows应用程序进行Web应用程序通信

Cannot access a disposed object. Object name: 'System.Net.Sockets.TcpClient'.

因此,重新工作,我关闭客户端应用程序,并再次打开时发生错误,并且然后正常工作。

我想要什么 我有一个Web应用程序,只能在FireFox上工作。我有一台打印机,需要通过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(); 
} 

我需要每次我上我的Web应用程序特定的按钮,用户点击,叫我btnImprimeBematech_Venda(),然后跟我的客户端应用进行打印。现在我需要关闭客户端应用程序,并且每次用户点击我的按钮打印时再次打开。

我对Thread了解不多,但也许我需要使用它。我不知道。

有人可以帮助我吗?

回答

0

我认为你的问题是你的客户端应用程序末尾的Close()调用。关闭将释放与套接字相关的所有资源,这解释了您的处置异常。尝试使用Shutdown,然后Disconnect(true)这应该允许您的套接字被重用。请参阅msdn文档here

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

相关问题