socket 服务 连接不上的问题。拜托了大神们
.NET 2.0 WINFORM 。一个socket 服务开启监听后,有很多的客户端连接。使用一段时间后,会出现某个客户端连接不上,重启客户端也不行。除非关掉服务端,在开启服务,那个连接不上的客户端才能连接上。大神们,能帮我分析下原因吗?服务端和客户端都是异步。 --------------------编程问答-------------------- 不搞定,就要被炒鱿鱼了 --------------------编程问答-------------------- 当出现某个客户端连接不上时,重起另外一个客户端试一下。
基本上问题应是服务器端。
--------------------编程问答-------------------- 检查一下服务端的socket连接等相关的资源有没有释放掉。 --------------------编程问答-------------------- 就算没释放掉,重启客户端的时候,也应该被释放了吧 --------------------编程问答--------------------
服务端的资源有没有释放掉,和你客户端重启与否有关系吗?
比如通过socket建立连接之后,客户端重启,而服务端与客户端保持连接的资源没有释放。 --------------------编程问答--------------------
你有调试过吗? --------------------编程问答-------------------- 遇到比较浅显的问题时不调试,仅仅要弄一堆理论“分析原因”翻来覆去地消磨时光去“讨论可能的原因”,我们被这种人深深地伤害过几百回。所以要解决问题首先前提就是“给出你的调试来”。 --------------------编程问答-------------------- udp还是tcp,怎么写的。 --------------------编程问答-------------------- 你的客户端如何在服务器注册的。当客户端掉线,又是怎么回收的。 --------------------编程问答-------------------- public void OnRecievedData(IAsyncResult ar)
{
try
{
SocketServerClient client = (SocketServerClient)ar.AsyncState;
byte[] aryRet = client.GetRecievedData(ar);
if (aryRet.Length < 1)
{
client.Sock.Close();
this.my_ClientList.Remove(client);
}
else
{
string data = Encoding.GetEncoding("GBK").GetString(aryRet);
this.OnReceivedString(this, new ReceivedMessageEventArgs(data, client, this.my_ClientList));
client.SetupRecieveCallback(this);
}
}
catch { }
}
客户端 下线后,服务端会收到 “0” ,上面的代码就回收了 --------------------编程问答-------------------- 我把服务器端代码贴出来 ,麻烦大家帮我看看 有没有问题
public class ServerSocked
{
// Fields
private Socket listener;
public ArrayList my_ClientList = new ArrayList();
public bool isRun = true;
// Events
public event ReceiveMessageHandler receiveddata;
// Methods
public void closeSocket()
{
try
{
this.isRun = false;
this.listener.Close();
foreach (SocketServerClient clientSend in this.my_ClientList)
{
clientSend.Sock.Close();
this.my_ClientList.Remove(clientSend);
//return;
}
}
catch
{
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
/// <summary>
/// 建立新连接
/// </summary>
/// <param name="sockClient"></param>
public void NewConnection(Socket sockClient)
{
try
{
SocketServerClient client = new SocketServerClient(sockClient);
this.my_ClientList.Add(client);
client.socketname = client.Sock.RemoteEndPoint.ToString();
client.SetupRecieveCallback(this);
}
catch { }
}
public void OnConnectRequest(IAsyncResult ar)
{
try
{
// if (this.isRun)
// {
Socket listener = (Socket)ar.AsyncState;
this.NewConnection(listener.EndAccept(ar));
listener.BeginAccept(new AsyncCallback(this.OnConnectRequest), listener);
// }
}
catch
{ }
}
public void OnReceivedString(object sender, ReceivedMessageEventArgs e)
{
try
{
if (this.receiveddata != null)
{
this.receiveddata(sender, e);
}
}
catch { }
}
public void OnRecievedData(IAsyncResult ar)
{
try
{
SocketServerClient client = (SocketServerClient)ar.AsyncState;
byte[] aryRet = client.GetRecievedData(ar);
if (aryRet.Length < 1)
{
client.Sock.Close();
this.my_ClientList.Remove(client);
}
else
{
string data = Encoding.GetEncoding("GBK").GetString(aryRet);
this.OnReceivedString(this, new ReceivedMessageEventArgs(data, client, this.my_ClientList));
client.SetupRecieveCallback(this);
}
}
catch { }
}
/// <summary>
/// 开始监听
/// </summary>
/// <param name="nPortListen"></param>
/// <param name="ip"></param>
public void startSocket(int nPortListen, string ip)
{
try
{
this.isRun = true;
IPAddress ipAddr = IPAddress.Parse(ip);
this.listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.listener.Bind(new IPEndPoint(ipAddr, nPortListen));
this.listener.Listen(1024);
this.listener.BeginAccept(new AsyncCallback(this.OnConnectRequest), this.listener);
}
catch
{
this.isRun = false;
//throw new ApplicationException("socket start error");
}
}
// Nested Types
public delegate void ReceiveMessageHandler(object sender, ReceivedMessageEventArgs e);
} --------------------编程问答-------------------- 客户端和服务端 有没有保持心跳连接?你可以参考下腾讯的QQ 处理方式 每台电脑的QQ过2分钟都会向服务器发送一个请求。如果服务器接收不到客户端发送的请求默认 客户端已经掉线关掉连接请求。
TCP 还是UDP 都需要注意适时释放链接请求。 --------------------编程问答-------------------- 谢谢 用的TCP --------------------编程问答-------------------- 调试啊 --------------------编程问答-------------------- 这种故障 ,可遇不可求啊 。没法调试啊。 --------------------编程问答-------------------- 做这个项目的人也是脑残 谁开发的啊
不用wcf脑残脑残脑残啊
自己写Socket 你对效率要求就这么高啊 --------------------编程问答-------------------- SocketAsyncEventArgs 保准解决后顾之忧 --------------------编程问答-------------------- 楼上大哥,能细说吗 --------------------编程问答--------------------
http://technet.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs(v=vs.90).aspx
已经封装好了 包括异步套接字池,自己只需要实现具体接收数据后处理的方法 --------------------编程问答-------------------- 对我代码改动太大了吧。还是谢谢你啊 --------------------编程问答-------------------- 某个客户连不上去,提示什么? --------------------编程问答-------------------- 直接跟 服务端 连接 不上 。 --------------------编程问答-------------------- 由于 接手 别人的 代码,所以 不敢做太大的改动 。麻烦大家了 --------------------编程问答-------------------- 一般来说是服务器出现问题导致无法接受或接受的连接被关闭 --------------------编程问答-------------------- 顶一下 。求帮帮忙
补充:.NET技术 , C#