TcpClient挂起

时间:2018-03-16 03:52:02

标签: c# stream tcpclient networkstream

我正在使用一个简单的客户端将数据发送到我办公室的服务器。我使用名为TCPServer的服务器在我的计算机上本地测试了代码,我连接,发送数据,接收回复,断开连接,再次发送,冲洗和重复,这一切都很完美,但当我连接到办公室并执行相同的操作时它连接好吧,我可以永远连接/断开连接,但是当我发送数据时它就会挂起。办公室的日志中没有收到任何内容。我无法在那里发送一个字节。

似乎没有防火墙问题。

但我可以运行我多年前在Delphi(pascal)中编写的旧程序,并且它连接并发送相同的数据而没有问题,相同的端口,所有内容,因此问题不是防火墙问题。对此的想法?这是基本的代码布局。

连接按钮 断开按钮 发送按钮

在类的顶部,我声明了TcpClient变量

id name country user_id gender
1 Cyrus MY 1 female
2 May US 2 male

在_Click for Connect按钮和断开连接按钮中,我有代码连接到服务器并设置一些指示符等

    public TcpClient m_client = new TcpClient();

“发送”按钮有自己的事件,主要是因为连接到办公室时可能需要一分钟才能创建套接字等。

    private void ConnectButton_Click(object sender, EventArgs e)
    {
        string address = FixIP(IPAddressMaskedTextBox.Text);
        int Port = Convert.ToInt32(PortNumberMaskedTextBox.Text);

        Control control = (Control)sender;
        String name = control.Name;
        try
        {
            switch (name)
            {
                case ("ConnectButton"):
                    //Connect to server
                    connect(address, Port);
                    if (m_client.Connected)
                    {
                        SingleConnectionRichTextBox.Clear();

                        ConnectedLightButton.BackColor = Color.Lime;
                        SingleConnectionRichTextBox.Text += "Connected at IP " + address + " and Port " + Port.ToString() + "\r\n";
                    }
                    break;
                case ("DisconnectButton"):
                    if (m_client.Connected)
                    {
                        SingleConnectionRichTextBox.Text += "Connection Terminated\r\n";
                        ConnectedLightButton.BackColor = Color.Red;
                        m_client.Client.Disconnect(false);
                        m_client = new TcpClient();
                    }
                    break;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.ToString());
        }
    }

    public void connect(string address, int port)
    {
        try
        {
            if (!m_client.Connected)
            {
                ConnectedLightButton.BackColor = Color.Yellow;
                SingleConnectionRichTextBox.Text += "Attempting to Connect...\r\n";
                m_client.Connect(address, port);
            }
            else
            {
                SingleConnectionRichTextBox.Text += "Connection Failed...\r\n";
                ConnectedLightButton.BackColor = Color.Red;
                throw new Exception("Connect: Already connected\r\n");
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.ToString());
        }
    }

这里有什么东西会引起明显的红旗吗?我试过Stream VS NetworkStream。我试过关闭回复听众。我把这个代码全部合并到一个函数中,并将TcpClient创建移动到另一个类作为静态,因此我可以在每个函数中创建它,但是虽然所有这些在本地工作正常,但没有任何东西可以连接到办公室。它不会发送单个字节。我也将m_client设置为静态顶部,在本地工作正常,而不是办公室。

GetStream可能会失败吗?或者它在不同的套接字上发送数据?

1 个答案:

答案 0 :(得分:0)

使用任务和取消令牌来取消任务。不要初始化“新的” TCPclient。在后台,TCPclient不会关闭(.net的套接字超时) 使用try catch来查看异常,并将日志添加到对话中以使其更加清晰