当前位置:编程学习 > C#/ASP.NET >>

socket 服务 连接不上的问题。拜托了大神们

.NET 2.0 WINFORM 。一个socket 服务开启监听后,有很多的客户端连接。使用一段时间后,会出现某个客户端连接不上,重启客户端也不行。除非关掉服务端,在开启服务,那个连接不上的客户端才能连接上。大神们,能帮我分析下原因吗?

服务端和客户端都是异步。 --------------------编程问答-------------------- 不搞定,就要被炒鱿鱼了 --------------------编程问答-------------------- 当出现某个客户端连接不上时,重起另外一个客户端试一下。
基本上问题应是服务器端。
--------------------编程问答-------------------- 检查一下服务端的socket连接等相关的资源有没有释放掉。 --------------------编程问答-------------------- 就算没释放掉,重启客户端的时候,也应该被释放了吧 --------------------编程问答--------------------
引用 4 楼 AllForJava 的回复:
就算没释放掉,重启客户端的时候,也应该被释放了吧

服务端的资源有没有释放掉,和你客户端重启与否有关系吗?
比如通过socket建立连接之后,客户端重启,而服务端与客户端保持连接的资源没有释放。 --------------------编程问答--------------------
引用 楼主 AllForJava 的回复:
.NET 2.0 WINFORM 。一个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 保准解决后顾之忧 --------------------编程问答-------------------- 楼上大哥,能细说吗 --------------------编程问答--------------------
引用 18 楼 AllForJava 的回复:
楼上大哥,能细说吗


http://technet.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs(v=vs.90).aspx

已经封装好了 包括异步套接字池,自己只需要实现具体接收数据后处理的方法  --------------------编程问答-------------------- 对我代码改动太大了吧。还是谢谢你啊 --------------------编程问答-------------------- 某个客户连不上去,提示什么? --------------------编程问答-------------------- 直接跟 服务端 连接 不上 。 --------------------编程问答-------------------- 由于 接手 别人的 代码,所以 不敢做太大的改动 。麻烦大家了  --------------------编程问答-------------------- 一般来说是服务器出现问题导致无法接受或接受的连接被关闭 --------------------编程问答-------------------- 顶一下 。求帮帮忙
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,