一个socket问题 新手望大家支持下 顶猛点~~~ 我用socket写了一个服务端和客户端 当多客户端连进来后 其中一个或者多个突然关闭了自己的客户端 问:那么我服务端怎么知道这个客户端的连接已经不存在了?而且要关闭掉它 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 receive(){ try { ... //这是接收数据的代码 } catch (System.Net.Sockets.SocketException e) { ... //如果客户端主动关闭了,会执行这里 } catch( Exception e ) { ... }}记得接收数据应另开一个新线程来操作. 还在吗 给我看看这个代码 :我新起一个线程来执行这里的接受数据:但是我的CPU100% 不知道怎么回事private void ThreadProc() { if(mySocket.Connected) { statusBar1.Text="与客户建立连接."; while(true) { Byte[] ByteRecv=new Byte[256]; mySocket.Receive(ByteRecv,ByteRecv.Length,0); string strRecv=Encoding.BigEndianUnicode.GetString(ByteRecv); rtbReceive.AppendText(strRecv+"\r\n"); } } Thread thread=new Thread(new ThreadStart(ThreadProc)); thread.Start(); 通过服务器不断地发心跳包来判断客户断是否断掉.我以前写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); } }你可以参考这个代码 WPF如何设置启动项?? 进销存系统中 暂估冲回 list删除元素后,会影响元素的引用吗?--理论问题 【WPF初学者的问题】WPF可以在浏览器上运行么?会取代HTML么? C#和C++/CLI有啥区别,各自的优缺点是什么?不发表意见不给分啊 在线急等,求大家帮帮忙。是个小问题,大侠一看就知道,字符串转具体对象的问题 了解个简单问题 如何使ComboBox控件只能选择备选项而不接受用户自行输入? Excel 2003 读取时出错 怎样把服务器上的word直接下载来呢 如何在C#中执行暴风影音 高分请教:如何在SQL SERVER 数据库存取二进制文件?
try
{
... //这是接收数据的代码
}
catch (System.Net.Sockets.SocketException e)
{
... //如果客户端主动关闭了,会执行这里
}
catch( Exception e )
{
...
}
}
记得接收数据应另开一个新线程来操作.
我新起一个线程来执行这里的接受数据:但是我的CPU100% 不知道怎么回事private void ThreadProc()
{
if(mySocket.Connected)
{
statusBar1.Text="与客户建立连接.";
while(true)
{
Byte[] ByteRecv=new Byte[256];
mySocket.Receive(ByteRecv,ByteRecv.Length,0);
string strRecv=Encoding.BigEndianUnicode.GetString(ByteRecv);
rtbReceive.AppendText(strRecv+"\r\n");
}
}
thread.Start();
我以前写socket时,发现客户端用任务管理器直接结果进程,服务器断会收不到客户端中断事件的.
//这句话有问题,你的mySocket是服务器端负责监听的socket吧!
Socket newSocket=mySocket.Accept() 这里返回一个新的socket,这个新Socket才是用来send和receive用的
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); } }
你可以参考这个代码