c# 网络通信连接问题

kinurs 2012-05-30 10:19:37
最近在做一个文件监控小程式,包含C/S架构,服务器端监控文件夹中文件变化,然后将变化后的文件发送到客户端.
在本机测试调试没有发现问题,在进行网络测试时发现问题了,客户端无法连接,准确来说,客户端无法收到服务器端的回应,以为自己没有连接上服务器端,于是报错误"10060",连接超时.但是在服务器端的连接日志中已经监听到客户端的连接,并记录了客户端的ip地址和端口.

详细出问题的代码如下:
客户端:
/// <summary>
/// 连接到服务器
/// </summary>
private void ConnectToServer()
{
lblInfo.Text = "Connecting to " + txtBoxServerIP.Text;
// string msg = "CONN|CONN|CONN|END";
//SendMessage(msg);
TcpClient tcpClient = new TcpClient();
try
{
lblInfo.Text = "Connecting ";// +txtBoxServerIP.Text;
tcpClient.Connect(txtBoxServerIP.Text.Trim(), Convert.ToInt32(txtBoxServerPort.Text));//阻断连接到服务器端口
if (tcpClient.Connected)
{
/*NetworkStream stream = tcpClient.GetStream();
do{
int len = stream.Read(new byte[1024], 0, 1024);
if (len > 0)
break;
}while(true);*/

localport = (tcpClient.Client.LocalEndPoint as IPEndPoint).Port; //获取本机连接的端口
this.txtBoxLocalPort.Text = localport.ToString();
//tcpClient.Client.Disconnect(true);
tcpClient.Close(); //连接成功后关闭连接

lblInfo.Text = "Server connected";
lblStatus.Text = "online";

//记录连接状态
connected = true;

//启动监听
this.listenerThread = new Thread(new ThreadStart(LocalListen));
this.listenerThread.IsBackground = true;
listenerThread.Start();

//改变按钮状态
btnDisconnect.Enabled = true;
btnConnect.Enabled = false;
}
}
catch (Exception ex)
{
//tcpClient.Close();
//lblInfo.Text = ex.Message;
lblInfo.Text = "Connect failed!";
MessageBox.Show(ex.Message);
}
finally
{
tcpClient.Close();
}

}

tcpClient.Connect(**),这一段连接出问题,直接进入catch块了.
服务器端日志显示,客户端尝试连接了3次

服务器端:
/// <summary>
/// 启动服务器端监听端口
/// </summary>
/// <param name="args"></param>
private void ServerListen(object args)
{

IPEndPoint iep = (IPEndPoint)args; //本地LocalEndPoint
//创建本地侦听连接
serverListen = new TcpListener(iep);
serverListen.Start(); //启动监听,阻塞方式,会一直监听,除非程序结束
//创建客户端连接对象

//ConnectedClient cc = null;
while (this.Running) //服务器状态
{

try
{
TcpClient remoteClient = serverListen.AcceptTcpClient(); //获取客户端连接对象
//新线程处理客户端连接
Thread thread = new Thread(new ParameterizedThreadStart(DealClientConnectOrProtocol));
thread.IsBackground = true;
thread.Name = remoteClient.Client.RemoteEndPoint.ToString();
thread.Start(remoteClient);
}
catch (Exception ex)
{
FileServerEventArgs e = new FileServerEventArgs();
e.Information = ex.Message;
this.OnClientConnected(e);
}

}
serverListen.Stop(); //关闭监听器
serverListen.Server.Close(); //关闭所有socket连接并释放所有资源
}

服务器端运行没有问题,监听到了客户端的连接

下面是服务器启动的线程执行的动作:
/// <summary>
/// 处理客户端连接行为或者发来的信息
/// </summary>
/// <param name="remoteClient"></param>
/// <returns></returns>
private void DealClientConnectOrProtocol(Object args)
{
lock (this.lockObj)
{
TcpClient remoteClient = args as TcpClient;
//读消息或协议
NetworkStream streamFromClient = remoteClient.GetStream();
byte[] buffer = new byte[8 * 1024]; //缓存区
int len = 0;

//接收数据
while (streamFromClient.DataAvailable)
{
len = streamFromClient.Read(buffer, 0, buffer.Length);
}

if (len > 0)
{
//处理协议
string protocol = Encoding.UTF8.GetString(buffer);
string[] token = protocol.Split(new char[] { '|' });
if (token[0].ToUpper().Equals("OFF")) //客户端离线
{
IPEndPoint remotePoint = remoteClient.Client.RemoteEndPoint as IPEndPoint;
RemoveFileClient(remotePoint.Address.ToString()); //移除客户端
}
}
else
{
//添加到客户端列表
IPEndPoint endpoint = remoteClient.Client.RemoteEndPoint as IPEndPoint;
ConnectedClient cc = new ConnectedClient(endpoint, endpoint.Port);
this.AddClient(cc); //将远程连接对象记录到集合中
cc.SendMessage("OK|OK|OK|END");
remoteClient.Close();
}
}
}

以上,请有通信方面经验的朋友给予指点.
这是我第一次写网络通信方面的程式,所以问题很多,来此和大家交流下.
补充:我自己的笔记本和台式机通信没有问题,但是除了我自己的两台电脑之外的公司其他电脑都不可以作为客户端连接(无法连接服务器),但是作为服务器端的话,我的电脑可以连接他们,但是接收不到服务器端检测到文件变化后发送的数据(传输协议),此时就和客户端连接不上服务器端一样的问题了.总结一下,就是除了我的两台电脑,其他电脑都没法连接另一台电脑(其实是连接上了,只是收不到目标电脑连接成功的反馈)

我把我的逻辑说明一下,也请大家看看是不是有问题

1.服务器启动监听指定端口
2.客户端连接服务器,并监听连接时所使用的随机端口,用来接收服务器端的信息
3.服务器端监控到文件改变,启动一个新的线程,监听随机本地端口,向客户端所监听的端口发送协议,内容包括,文件名,文件大小,传输端口号
4.客户端解析协议,根据协议中的端口号连接到服务器临时开启的监听端口
5.服务器端监听到客户端连接后,发送文件,发送完成后关闭连接和监听
6.客户端接受完文件后关闭连接.
...全文
129 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinurs 2012-06-01
  • 打赏
  • 举报
回复
个人觉得不是防火墙的问题,因为我自己的两台电脑和公司的电脑在一个网络环境中,在一个防火墙不会无故拦截正常的网络连接.问题可能还是出在程式上,请有经验的朋友提供帮助
绝代坏坏 2012-05-30
  • 打赏
  • 举报
回复
看一下用户的防火墙。包括软件和硬件两种。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧