请教一个C# TCP/IP通讯问题(WinForm)信息全,可供学习参考【高分】
全局参数:
Thread workthread;
Thread tLogin;
Thread tConnectToRemote;
Thread tRemoteSocketRead;
TcpClient remoteTcpClient=new TcpClient();
NetworkStream remoteNetStr;
private static bool RemoteIsLogin = false;
private static bool RemoteIsConnected = false;
Main_Load中(线程方式启动主程序StartWinMDT):
workthread = new Thread(new ThreadStart(StartWinMDT));
workthread.IsBackground = true;
workthread.Start();
StartWinMDT中:
tConnectToRemote = new Thread(new ThreadStart(tConnectToRemoteTcp)); //连接远程delphi socket 端口
tConnectToRemote.IsBackground = true;
tRemoteSocketRead = new Thread(new ThreadStart(RemoteCenterSocketRead));//开始监听远程 socket 内容
tRemoteSocketRead.IsBackground = true;
tLogin = new Thread(new ThreadStart(RemoteLogin)); 远程连接完成后 发送登录协议
tLogin.IsBackground = true;
tConnectToRemoteTcp(连接远程delphi socket 端口)中:
try
{
do
{
if (!RemoteIsConnected)
{
ConnectToRemote(); //连接远程 服务器
tRemoteSocketRead.Start(); //启动监听线程
if (RemoteIsConnected)
{
tLogin.Start();//如果成功连接后开始发送登录协议
}
}
Thread.Sleep(iConnectTime);
}
while (RemoteIsConnected);
}
catch { }
}
#region ConnectToRemote()与上级服务器建立连接
private bool ConnectToRemote()
{
bool p_rec = false;
try
{
remoteTcpClient.Connect(IPAddress.Parse(sRemoteHost), Int32.Parse(sRemotePort));
if (remoteTcpClient.Connected)
{
RemoteIsConnected = true;
remoteNetStr = remoteTcpClient.GetStream(); // 获取远程数据流到全局变量remoteNetStr
p_rec = true;
}
else
{
txbRemote.Text += "与上级服务器 " + sSName + " 的连接已经断开!";
Thread.Sleep(iConnectTime);
}
}
catch (Exception ex)
{
WriteTextBox(txbRemote, "与上级服务器 " + sSName + " 连接失败:" + ex.Message.ToString());
}
return p_rec;
}
#endregion
RemoteLogin中
private void RemoteLogin()
{
do
{
// Thread.Sleep(iWaitLoginTime);
if (remoteTcpClient.Connected && remoteNetStr!=null && remoteNetStr.CanWrite)
{
try
{
int intCoalLoginCount = 0;
for (int tmpi = 0; tmpi < CoalArray.Count; tmpi++)
{
if (Convert.ToBoolean(CoalArrayIfLogin[tmpi]) == false)
{
byte[] _SendRemoteLoginData = SendRemoteLoginData(Convert.ToInt32(CoalArray[tmpi]));
TcpSendToRemoteCenter(_SendRemoteLoginData, "20");
// SendRemoteLoginData与TcpSendToRemoteCenter 为组件登录协议包,为了不影响阅读没有贴上
Thread.Sleep(iWaitLoginTime);//LoadTime
}
if (Convert.ToBoolean(CoalArrayIfLogin[tmpi]))
intCoalLoginCount = intCoalLoginCount + 1;
}
if (intCoalLoginCount == CoalArray.Count) //已经全部登录
{
if (RemoteIsLogin == false)
WriteTextBox(txbRemote, "所有终端登录成功!!");
RemoteIsLogin = true;
}
}
catch (Exception ex)
{
WriteTextBox(txbRemote, "请求登录上级服务器" + sSName + "过程中失败:" + ex.Message.ToString());
}
}
Thread.Sleep(5000);
}
while (!RemoteIsLogin);
}
private void RemoteCenterSocketRead()
{
while (true)
{
if (remoteNetStr != null && remoteNetStr.CanRead)
{
int nsLen = 1024;
byte[] responseBuffer = new byte[nsLen];
int numberOfBytesRead = 0;
MemoryStream memStream = new MemoryStream();
try
{
do
{
numberOfBytesRead = remoteNetStr.Read(responseBuffer, 0, nsLen);
memStream.Write(responseBuffer, 0, numberOfBytesRead);
}
while (remoteNetStr.DataAvailable);
}
catch { }
byte[] buffer = TrimBytes(memStream.GetBuffer());
memStream.Dispose();
//处理远程响应回来内容,在此处对获取到的buffer 进行处理
}
else
{
try
{
if (remoteNetStr != null)
{
remoteNetStr.Dispose();
}
}
catch { }
finally
{
ConnectToRemote();
}
}
}// end while
}
现在的问题是 比如有10个终端,有什么原因可以造成登录不稳定,即有的成功,有的反复重发也不成功?注此程序为改写一基于delphi程序,和delphi程序相比,登录成功率低,求教可能原因,先谢了