日期:2014-05-18  浏览次数:20808 次

一个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);

}

}
你可以参考这个代码