关于子窗体和主窗体的TCP调用的问题

ucyhboy 2011-09-09 09:31:39
我主窗体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函数给客户端发送数据,还有就是不知道监听是不是也被复位了
...全文
32 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ucyhboy 2011-09-09
  • 打赏
  • 举报
回复
非常谢谢,我试试看
bdmh 2011-09-09
  • 打赏
  • 举报
回复
new了一个新的,新实例中一切清零,公用变量设置为全局或static的

110,534

社区成员

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

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

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