我正在编写一个应用程序,用于向服务器发送数据或从服务器接收数据。我需要在发送一些数据之前建立一个连接,并需要保持它的打开状态,以便用户可以连续发送数据。用户可以通过单击disconnect按钮随时关闭连接。我创建了两个按钮,一个用于连接,另一个用于断开连接。Disconnect按钮后面的代码如下:
private void button1_Click(object sender, EventArgs e)
{
if (tcpclnt.Connected)
{
tcpclnt.Client.Disconnect(false);
stm.Close();
}
else
{
MessageBox.Show("Not Connected");
}
}connect按钮的代码如下:
public ASCIIEncoding asen = new ASCIIEncoding();
public TcpClient tcpclnt = new TcpClient();
public NetworkStream stm;
private void Connect_Click(object sender, EventArgs e)
{
if (!tcpclnt.Connected)
{
tcpclnt.Connect("XX.XX.XX.XX", 5500);
MessageBox.Show("Connected to server");
stm = tcpclnt.GetStream();
string sysname = "000B0000" + SystemName.Text.ToString();
byte[] sys1 = asen.GetBytes(sysname);
sys1[0] = 0; sys1[1] = 0;
sys1[2] = 0; sys1[3] = 0xB;
sys1[4] = 0; sys1[5] = 0;
sys1[6] = 0; sys1[7] = 0;
try
{
stm.Write(sys1, 0, sys1.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
MessageBox.Show("Error in Sending data");
}
if (stm.DataAvailable)
{
try
{
byte[] bb = new byte[600];
int k = 8;
k = stm.Read(bb, 0, bb.Length);
string value = ASCIIEncoding.ASCII.GetString(bb, 8, k - 8);
MessageBox.Show(value.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
MessageBox.Show("Error in Reading data");
}
}
}
else {
MessageBox.Show("Already Connected");
}
} 现在,当我单击Disconnect按钮并再次单击connect按钮时,它在tcpclient.connect行上抛出了一个异常。我不明白为什么或者我该怎么解决它。
发布于 2012-07-01 13:50:35
我不是这方面的专家,但我认为一种可能的解决方案是使用tcpclnt.Close()优雅地关闭连接。如果你不这样做,或者让垃圾收集器不得体地这样做,那么你就不能重新连接(我认为)。关闭流,然后关闭tcpclnt,而不是断开连接。
tcpclnt.GetStream().Close();
tcpclnt.Close();此外,不要使用tcpclnt.Connected来检查是否有连接。只需简单地关闭它。
编辑
上面的方法不起作用。我不知道如何重用套接字。我就是这样让它工作的.
private void DisconnectButton_Click(object sender, EventArgs e)
{
tcpclnt.Close();
tcpclnt = new TcpClient();
}您提到,重新实例化对象会创建额外的线程。这可能是真的,因为我不确定如何测试它。我打开windows资源监视器,观察应用程序的线程数,每次都没有显示额外的线程打开。
发布于 2012-07-01 09:54:43
您的.Disconnect()调用需要将true作为参数以允许重用。您当前正在通知套接字禁止重新连接。文档的See here。
https://stackoverflow.com/questions/11278953
复制相似问题