我做了一个服务器端的程序,要实时在线监听客户端的连接。while (true)
{
try
{
hospitalTcpClient = hospitalTcpListener.AcceptTcpClient();
}
catch
{
hospitalTcpListener.Stop();
}但是这样在停止监听时就会出错,因为hospitalTcpListener.AcceptTcpClient();正在阻塞中,
问题1:设计模式不对?那如何设计?
问题2:采用这种模式,那如何正确的结束监听呢?
谢谢~~
{
try
{
hospitalTcpClient = hospitalTcpListener.AcceptTcpClient();
}
catch
{
hospitalTcpListener.Stop();
}但是这样在停止监听时就会出错,因为hospitalTcpListener.AcceptTcpClient();正在阻塞中,
问题1:设计模式不对?那如何设计?
问题2:采用这种模式,那如何正确的结束监听呢?
谢谢~~
解决方案 »
- C# 如何动态的将符合要求的数据放入到列表中
- 怎么在客户端改变defaultButton
- 如何让DataSet与DataGrid排序后同步
- 在petshop里面defult.aspx有下面一个语句,请问怎么解释
- 求C#编写的SQL数据备份和还原~~~~~~~~~~~~~~~~~
- 关于用C#设计KWIC(KEY WORD IN CONTEXT)系统设计模块,看不懂:(在线等注释,非常感谢!HELP!!给分答谢哦:)
- 求读取pdf文件中图片的方法
- 如何获取Resources中文件类型?
- 问题
- 对于一个Timer[]数组的tick()事件,如何区分是哪个Timer[?]产生的事件?
- C#中怎么判断进程是否结束
- C# winform 大手 进来看下吧 新手进来下也可以
我的程序启动之后就开启了一个线程1(防卡),在1中进行AcceptTcpClient(),然后如果有客户连接,会再启动一个线程2(每个客户都有一个线程),现在的问题是,如何才能结束监听呢?
2,监听需要关闭 lisner.Stop();
3,关闭套接字 Socketclient.Close();
4, 如果是传文件的话还需要关闭流文件 MyFileStream.close();
如果用TempThread.Abort()结束线程,那我以后就无法开启这个线程了。
如果我没有关闭程序,只是暂时停止监听了,如果把线程都终结了,我怎么再把线程启动起来,难道把软件重启?
开启线程1进行接收客户端的连接得到TcpClient,同时开启线程2进行该TcpClient的接收TcpClient.close()后关闭线程2
接着关闭线程1 TcpListener.stop()(如果监听对象不关闭,下次重新开启线程1就可继续接收)也可把这两个线程的isbackground属性设置为true 这样主线程关闭时他们也会关闭
有几个地方我不太明白,还请指教:
1.创建TcpListener并监听----只是接受一个客户端吗?如果不是,那
这个应该不能关闭吧?这是一个从线程,就是说有客户连接的时候都走这步,是不是应该让其执行完之后自动退出呢?
2.我的意思就是你要在线程关闭前释放这个对象的资源
打个比方,就好比你要去个地方求职(相当与你这里客户端的连接) TcpListener就相当于老板 TcpListener.acceptTcpCLient相当与老板在等人来应聘 你客户端有连接请求就相当与来应聘 没人来他就一直在等不能做下面的事 这就是阻塞 假如你销毁了线程 他也就不等了 但是TcpListener也就是老板依旧存在 你的阻塞的监听这个概念应该是相当与老板等与不等的概念
Thread thread=new Thread(new ThreadStart(接收连接方法));
void Start()
{
listener创建thread.start()
}
再想开启thread.start()不行么?
{
Thread startExpertServiceThread = new Thread(new ThreadStart(BeginListenExpert));
startExpertServiceThread.IsBackground = true;
startExpertServiceThread.Start();
}
public void BeginListenExpert()
{
try
{
expertTcpListener = new TcpListener(IPAddress.Parse(this.getIpValuesDelegate()), 7000);
expertTcpListener.Start();
}
catch (Exception ex)
{
//BLL.Assist.WriteLogs("端口" + expertTcpListener.LocalEndpoint.ToString().Split(':')[1] + "监听失败原因:" + ex.Message);
MessageBox.Show("端口"+expertTcpListener.LocalEndpoint.ToString().Split(':')[1]+"监听失败!网络连接不可用或另一个程序正在运行!");
return;
}
//BLL.Assist.WriteLogs("专家服务程序开始监听客户端的请求!");
while (true)
{
try
{
expertTcpClient = expertTcpListener.AcceptTcpClient();//有客户连接的时候发生
}
catch
{
try
{
hospitalTcpListener.Stop();
//this.exceptionWorkDelegate();
}
catch
{
//this.exceptionWorkDelegate();
} continue;
}
string expertRemoteEndPoint = expertTcpClient.Client.RemoteEndPoint.ToString();
//BLL.Assist.WriteLogs("与" + expertRemoteEndPoint.Split(':')[0] + "在端口" + expertRemoteEndPoint.Split(':')[1] + "建立连接");
expertClientList = new BLL.ClientList(expertTcpClient); ParameterizedThreadStart pts = new ParameterizedThreadStart(ExpertStartService);
Thread myThread = new Thread(pts);
myThread.Start(expertClientList);
}
}
public void ExpertStartService(object obj)
{
try
{
BLL.ClientList expertClientList = (BLL.ClientList)obj;
// string clientIP = expertClientList.Clients.Client.RemoteEndPoint.ToString().Split(':')[0];
bool IsConnect = expertClientList.Clients.Connected;
……………………
private void btnStartService_Click(object sender, EventArgs e)
是开启服务的按钮事件,问的就是停止监听按钮如何设计?