关于子窗体和主窗体的TCP调用的问题
我主窗体FrmMainProgram的部分代码
private const string NRT = "N";
private Thread TdMain = null;
private Thread TdmMain = null;
private TcpListener tcplMain = null;
private ArrayList arrClient = new ArrayList();
private Int32 iClient = 0;
private Int32 IsInterface = 0;
private void StartClientListen()
{
DataMember dmIO = new DataMember();
tcplMain = new TcpListener(IPAddress.Parse(dmIO.IP), dmIO.PortNum);
ThreadStart tdsMain = new ThreadStart(StartListen);
TdMain = new Thread(tdsMain);
TdMain.Start();
WriteMsgToLog("主程序已经启动监听了...");
WriteMsgToLog("监听IP="+dmIO.IP +" 端口="+dmIO.PortNum.ToString());
//TdMain.IsBackground = true;
}
private void StartListen()
{
tcplMain.Start();
while (true)//
{
TcpClient TcpC = tcplMain.AcceptTcpClient();
arrClient.Add(TcpC);
ParameterizedThreadStart ThreadStart = new ParameterizedThreadStart(AcceptClientMsg);
TdmMain = new Thread(ThreadStart);
TdmMain.Start(TcpC);
TdmMain.IsBackground = true;
//Console.WriteLine(iClient.ToString() + "=" + TcpC.Client.RemoteEndPoint);
csPulicInformation csInterface = new csPulicInformation();
DataMember dmInterface=new DataMember();
csInterface.INIWriteValue("接口服务器", "P" + iClient.ToString(), TcpC.Client.RemoteEndPoint.ToString(), dmInterface.SystemConfigFile );
iClient = iClient + 1;//客户端累加计数
csInterface.INIWriteValue("接口服务器", "sum", iClient.ToString(), dmInterface.SystemConfigFile);
Application.DoEvents();
}
}
private void AcceptClientMsg(object arg)
{
TcpClient TcpC = (TcpClient)arg;
NetworkStream ns = TcpC.GetStream();
while (TcpC.Connected == true)
{
try
{
byte[] Data = new byte[1024];
Int32 iLen = ns.Read(Data, 0, Data.Length);
string strMsg = "";
if (iLen > 0)
{
strMsg = Encoding.Default.GetString(Data, 0, iLen);
}
ns.Flush();
if (strMsg.Length > 0)
{
ExplainClientMsg(strMsg);
}
}
catch(Exception ee)
{
WriteErrorLog(ee.Message);
return;
}
Application.DoEvents();
}
}
/// <summary>
/// SendMessageToClient 发送数据到数据接口服务器
/// string MsgTag 事件标记码
/// bool bWaitReturn 是否需要回答
/// Int32 iParameter 参数的个数
/// </summary>
/// <param name="MsgTag"></param>
/// <param name="bWaitReturn"></param>
/// <param name="iParameter"></param>
public void SendMessageToClient(string MsgTag,bool bWaitReturn,Int32 iParameter)
{
string strSendMsg = "";
strSendMsg = PITEHead + "," + MsgTag + "," + (bWaitReturn == true ? RT : NRT ) + "," + iParameter.ToString() + PITEEnd;
if (arrClient.Count > 0)
{
TcpClient tcpC = (TcpClient)arrClient[IsInterface];
if (tcpC.Connected == true)
{
NetworkStream ns = tcpC.GetStream();
byte[] SendMsg = Encoding.Default.GetBytes(strSendMsg);
ns.Write(SendMsg, 0, strSendMsg.Length);
ns.Flush();
WriteMsgToLog(strSendMsg);
}
}
}
子窗体的代码:
private void SetErrboardWorkState()
{
DataMember dmInterface = new DataMember();
csPulicInformation csInterface = new csPulicInformation();
FrmMainProgram fmp = new FrmMainProgram();
dmInterface.ErrState = 0;
string strParameter = dmInterface.ErrState.ToString();
csInterface.INIWriteValue("ErrSetState", "P1", strParameter, dmInterface.ErrboardIniFilePath);
fmp.SendMessageToClient("ErrSetState", false, 1);//设置误差板工作状态
}
语句1 FrmMainProgram fmp = new FrmMainProgram(); 像引用主窗体的SendMessageToClient函数
fmp.SendMessageToClient("ErrSetState", false, 1);//设置误差板工作状态
本来的我主窗体已经有客户连接了,arrClient.Count 是大于0的
当我在子窗体执行语句1后,arrClient.Count =0出现复位了,所以我无法使用主窗体的SendMessageToClient函数给客户端发送数据,还有就是不知道监听是不是也被复位了