一个socket问题 新手望大家支持下 顶猛点~~~
我用socket写了一个服务端和客户端 当多客户端连进来后 其中一个或者多个突然关闭了自己的客户端 问:那么我服务端怎么知道这个客户端的连接已经不存在了?而且要关闭掉它
------解决方案--------------------receive(){
try
{
... //这是接收数据的代码
}
catch (System.Net.Sockets.SocketException e)
{
... //如果客户端主动关闭了,会执行这里
}
catch( Exception e )
{
...
}
}
记得接收数据应另开一个新线程来操作.
------解决方案--------------------你的连接断了 服务器端有异常哈
------解决方案--------------------通过服务器不断地发心跳包来判断客户断是否断掉.
我以前写socket时,发现客户端用任务管理器直接结果进程,服务器断会收不到客户端中断事件的.
------解决方案--------------------if(mySocket.Connected)
//这句话有问题,你的mySocket是服务器端负责监听的socket吧!
Socket newSocket=mySocket.Accept() 这里返回一个新的socket,这个新Socket才是用来send和receive用的
------解决方案--------------------服务端:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
Thread mythread ;
Socket socket;
public static IPAddress GetServerIP()
{
IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());
return ieh.AddressList[0];
}
private void BeginListen()
{
IPAddress ServerIp=GetServerIP();
IPEndPoint iep=new IPEndPoint(ServerIp,8000);
socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
byte[] byteMessage=new byte[100];
this.label1.Text=iep.ToString();
socket.Bind(iep);
while(true)
{
try
{
socket.Listen(5);
Socket newSocket=socket.Accept();
newSocket.Receive(byteMessage);
string sTime = DateTime.Now.ToShortTimeString ( ) ;
string msg=sTime+ ": "+ "Message from: ";
msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);
this.listBox1.Items.Add(msg);
}
catch(SocketException ex)
{
this.label1.Text+=ex.ToString();
}
}
// while(byteMessage!=null);
}
//开始监听
private void button1_Click(object sender, System.EventArgs e)
{
try
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start();
}
catch(
System.Exception er)
{
MessageBox.Show(er.Message, "完成 ",MessageBoxButtons.OK,MessageBoxIcon.Stop);
}
}
你可以参考这个代码