我正在使用一个简单的客户端将数据发送到我办公室的服务器。我使用名为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可能会失败吗?或者它在不同的套接字上发送数据?
答案 0 :(得分:0)
使用任务和取消令牌来取消任务。不要初始化“新的” TCPclient。在后台,TCPclient不会关闭(.net的套接字超时) 使用try catch来查看异常,并将日志添加到对话中以使其更加清晰