本人是个新手。第一次用TcpListener做服务器。发现一个问题。当服务器监听端口时,客户端断开时在网络连接处还可以看到原本客户端连接的信息。当新的客户端连接时又出现一个新的连接,在此我想知道如何去掉之前的客户端连接。。因为我是新手。各位大大能不能帮我看看我的程序那儿出了问题。最好能有程序上来
以下是我编的程序(本人不会异步。所以用了同步的)
//定义
delegate void AddString_del(string str);
AddString_del addDel;//该代理用于向接收窗体添加数据
Thread thListen;//监听线程
TcpClient tcpClient;
TcpListener serverListener;
bool islian = false;
#region 点击GPRS打开事件
/// <summary>
/// 点击GPRS打开事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenGPRS_Click(object sender, EventArgs e)//
{
IPAddress serverIp=null;
int port = 0;
serverIp = IPAddress.Parse(this.IP.Text.ToString());
port = Convert.ToInt32(this.port.Text.ToString());
IPEndPoint local = new IPEndPoint(serverIp, port);
serverListener = new TcpListener(local);
serverListener.Start();
//
thListen = new Thread(new ThreadStart(ServerListen));
thListen.Start();
}
#endregion #region 监听GPRS客户端
/// <summary>
/// 监听GPRS客户端
/// </summary>
private void ServerListen()
{ while (true)
{
tcpClient = serverListener.AcceptTcpClient();
Thread tcpthread = new Thread(DoSomeThing);//创建新线程,这样程序可以立刻进入下一次while循环,处理新的客户端接入
tcpthread.Start(tcpClient);//把新获得的连接作为参数传过去(其实也可以不传,因为你的tcpClient是全局的)
}
}
#endregion #region 为每一个客户端接入创建的处理线程
///
///为每一个客户端接入创建的处理线程
///
private void DoSomeThing(object parmater)
{
TcpClient newTcpClient = parmater as TcpClient;//将参数转换成TcpClinet
int a = 0;
byte[] buffer = new byte[1024]; NetworkStream stream = newTcpClient.GetStream(); // if (newTcpClient.Connected)
{
islian = true;
}
else
{
islian = false;
}
while (islian)
{
//Thread.Sleep(1000);
try
{ a = stream.Read(buffer, 0, 1024);
string temp = "", message = "";
if (a > 0)
{
islian = true;
temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a);
// message += temp; message = Encoding.ASCII.GetString(buffer, 0, a);
textBox111.Invoke(addDel, temp + "\n");
//MessageBox.Show("接收到" + message);
stream.Flush();
}
else
{
islian = false;
newTcpClient.Close();
break;
//stream.Flush();
//MessageBox.Show("断开"); }
//stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉
}
catch (Exception)
{
//TODO:接收数据线程异常处理
if (newTcpClient != null)
{
newTcpClient.Close();
}
islian = false;
//MessageBox.Show(ex.Message+"cuowu");
//textBox3.Invoke(addDel, ex.Message);
break; }
} }
#endregion
以上就是我所编的程序。。真的不知道如何在客户端断开后关闭连接。。希望有人能帮看看问题出在那儿
以下是我编的程序(本人不会异步。所以用了同步的)
//定义
delegate void AddString_del(string str);
AddString_del addDel;//该代理用于向接收窗体添加数据
Thread thListen;//监听线程
TcpClient tcpClient;
TcpListener serverListener;
bool islian = false;
#region 点击GPRS打开事件
/// <summary>
/// 点击GPRS打开事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenGPRS_Click(object sender, EventArgs e)//
{
IPAddress serverIp=null;
int port = 0;
serverIp = IPAddress.Parse(this.IP.Text.ToString());
port = Convert.ToInt32(this.port.Text.ToString());
IPEndPoint local = new IPEndPoint(serverIp, port);
serverListener = new TcpListener(local);
serverListener.Start();
//
thListen = new Thread(new ThreadStart(ServerListen));
thListen.Start();
}
#endregion #region 监听GPRS客户端
/// <summary>
/// 监听GPRS客户端
/// </summary>
private void ServerListen()
{ while (true)
{
tcpClient = serverListener.AcceptTcpClient();
Thread tcpthread = new Thread(DoSomeThing);//创建新线程,这样程序可以立刻进入下一次while循环,处理新的客户端接入
tcpthread.Start(tcpClient);//把新获得的连接作为参数传过去(其实也可以不传,因为你的tcpClient是全局的)
}
}
#endregion #region 为每一个客户端接入创建的处理线程
///
///为每一个客户端接入创建的处理线程
///
private void DoSomeThing(object parmater)
{
TcpClient newTcpClient = parmater as TcpClient;//将参数转换成TcpClinet
int a = 0;
byte[] buffer = new byte[1024]; NetworkStream stream = newTcpClient.GetStream(); // if (newTcpClient.Connected)
{
islian = true;
}
else
{
islian = false;
}
while (islian)
{
//Thread.Sleep(1000);
try
{ a = stream.Read(buffer, 0, 1024);
string temp = "", message = "";
if (a > 0)
{
islian = true;
temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a);
// message += temp; message = Encoding.ASCII.GetString(buffer, 0, a);
textBox111.Invoke(addDel, temp + "\n");
//MessageBox.Show("接收到" + message);
stream.Flush();
}
else
{
islian = false;
newTcpClient.Close();
break;
//stream.Flush();
//MessageBox.Show("断开"); }
//stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉
}
catch (Exception)
{
//TODO:接收数据线程异常处理
if (newTcpClient != null)
{
newTcpClient.Close();
}
islian = false;
//MessageBox.Show(ex.Message+"cuowu");
//textBox3.Invoke(addDel, ex.Message);
break; }
} }
#endregion
以上就是我所编的程序。。真的不知道如何在客户端断开后关闭连接。。希望有人能帮看看问题出在那儿
解决方案 »
- 如何在客户端使用InstallUtil工具安装服务
- 用C#调用 google v8的dll文件?
- 把fromborderstyle 设置为none后,拖动窗体时没有虚线了,如何实现拖动窗体又出现虚线
- (C#)可以用.net程序直接从.rpt文件将字段读到数据库吗?
- 请问unsigned char *pData要怎样Marshal?
- 100分求一个用SOAP的CHAT SYSTEM例子
- [高兴,散分,来者有份] 问题解决:(VSTS出错:TF30177 创建团队项目失败)
- 你也能做到:U 盘改 MP3 (自己动手,三步搞定)
- NUnit的问题
- HttpWebRequest.GetRequestStream()引发400异常后,如何获取确切的错误信息
- VS CTRL+ALT+P 不能调试
- c#调用delphi dll问题
参考看看
//等待一个连接
while (true)
{
//接收一个客户端连接(AcceptSocket函数是阻塞的)
TCommon.WriteLog("等待一个客户端连接......", CLOG.TO_CONSOLE, CLABEL.INFO);
Socket client = m_Listener.AcceptSocket();
//取得客户端IP
m_strClientIP = client.RemoteEndPoint.ToString();
m_strClientIP = m_strClientIP.Substring(0, m_strClientIP.IndexOf(":"));
TCommon.WriteLog("客户端 : [" + m_strClientIP + "] 已连接。", CLOG.TO_BOTH, CLABEL.INFO); //接收数据
while (true)
{
Byte[] buffer = new Byte[CSOCKET.BUFF_SIZE];
//读取数据(Receive函数是阻塞的)
int ReceivedLength = client.Receive(buffer);
if (ReceivedLength > 0)
{
string strReceive = Encoding.Unicode.GetString(buffer, 0, ReceivedLength);
TCommon.WriteLog("从 [" + m_strClientIP + "] 收到 : " + strReceive, CLOG.TO_BOTH, CLABEL.INFO);
//处理收到的数据
ProcessData(strReceive);
}
else
{
//连接已断开
client.Shutdown(SocketShutdown.Both);
client.Close();
TCommon.WriteLog("客户端 : [" + m_strClientIP + "] 已断开。", CLOG.TO_BOTH, CLABEL.INFO);
break;
}
} //继续等待一个新的连接
}
private void ServerListen()
private void DoSomeThing(object parmater)这2个函数一样。测试了一下你的程序。发现
不知道是我不会做还是有别的原因。。还是发现你那儿有很多的连接。。客户端断后连接还是存在。
客户端定时发心跳包,服务器端收不到,就把对应的Socket关掉。