关于子窗体和主窗体的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函数给客户端发送数据,还有就是不知道监听是不是也被复位了
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函数给客户端发送数据,还有就是不知道监听是不是也被复位了
...全文
相关推荐
自测试卷5.doc1.简述C#、Java和C++的比较。 2.已知变量x的初值为24,则表达式x+=x--+=x%=17运算的结果值为( )。
选项D描述错误,MDI子窗体最小化时,其图标会显示在MDI主窗体上,而非任务栏。11.
2021-2022计算机二级等级考试试题及答案No.14930.docx
主窗体与子窗体的链接字段通常在数据源中定义,不一定要在界面中显示。13. 数据管理是数据处理的核心问题,涉及数据的组织、存储和检索。14. `Trim`函数可以同时去除字符串的前导和尾部空白。15.
C#实现子窗体与父窗体通信方法实例总结
“C#实现子窗体与父窗体通信方法实例总结,包括四种不同的通信方式,如通过接口、事件、直接引用以及定义方法。”在C#编程中,尤其是在开发带有多个窗口的应用程序时,子窗体与父窗体之间的通信是必不可少的
C#窗体基于TCP的Socket多线程通信
本主题将深入探讨如何在C#窗体应用中实现基于TCP的Socket多线程通信,包括互发消息和传输文件。
C#调用VLC 多窗体播放功能
VLC是一款开源的媒体播放器,以其强大的跨平台能力和多种格式支持而知名。本话题将深入探讨如何利用C#调用VLC插件来实现多窗体播放RTSP视频流的功能。


