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

我做的是一个用Socket上传的功能,这边是服务端口的代码,文件上传完毕的时候,服务端的也会被关闭,但是第二次重新监听到的话就会报个错,图片在下面,求大神指教

 public void burn()//服务器端
        {
            // 创建负责监听的套接字,注意其中的参数;
            if (socketWatch != null)
            {
                socketWatch.Close();
            }
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 获得文本框中的IP对象;
            IPAddress address = IPAddress.Parse(ServerIP);
            // 创建包含ip和端口号的网络节点对象;
            IPEndPoint endPoint = new IPEndPoint(address, 9777);
            try
            {
                // 将负责监听的套接字绑定到唯一的ip和端口上;

                socketWatch.Bind(endPoint);
            }
            catch (SocketException se)
            {

            }
            // 设置监听队列的长度;
            socketWatch.Listen(11);
            // 创建负责监听的线程;
            Thread.Sleep(5000);
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;
            threadWatch.Start();
        }
        /// <summary>
        /// 监听客户端请求的方法;
        /// </summary>
        public void WatchConnecting()
        {
            while (true)  // 持续不断的监听客户端的连接请求;
            {
                try
                {
                    
                    // 开始监听客户端连接请求,Accept方法会阻断当前的线程;
                    Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
                    if (sokConnection.Available <= 0) continue;
                    // 将与客户端连接的 套接字 对象添加到集合中;
                    socketip = sokConnection.RemoteEndPoint.ToString();
                    dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
                    RecMsg();
                }
                catch (SocketException ex)
                {
                    socketWatch.Close();
                }
            }
        }
 public void RecMsg()
        {
            //while (true)
            //{
                int length = -1;
                byte[] arrMsgRec = new byte[1024];
                try
                {
                   length = dict[socketip].Receive(arrMsgRec); // 接收数据,并返回数据的长度;

                    int le = Convert.ToInt16(arrMsgRec[1]);
                    string[] msg = Encoding.UTF8.GetString(arrMsgRec, 2, le).Split(',');
                    count = Convert.ToInt64(msg[1]);
                    statername = msg[0];
                    fs = new FileStream(FileFolder + StrFileName, FileMode.Append, FileAccess.Write);
                    byte[] arrtext = new byte[8192];
                    Getfileszie = 0;
                    while (Getfileszie < count)
                    {
                        try
                        {
                            length = dict[socketip].Receive(arrtext); // 接收数据,并返回数据的长度;
                            Getfileszie = length + Getfileszie;
                            try
                            {
                                fs.Write(arrtext, 0, length);
                            }
                            catch (Exception x)
                            {
                                //Function.WriteLog(0, "********************************异常xxx:" + x.Message + "********************************");
                            }
                        }
                        catch (Exception x)
                        {
                            //Function.WriteLog("********************************异常接收数据:" + x.Message + "********************************");
                        }
                    }
                }
                catch (SocketException se)
                {
                    return;
                }
                finally
                {
                    dict[socketip].Close();
                    if (dict.ContainsKey(socketip))
                    {
                        dict.Remove(socketip);
                    }
                }
            //}
        }


Socket 上传功能 单例的话应该怎么实例化 --------------------编程问答-------------------- 代码不是这么写的, 上MSDN找一个完整的例子看看吧。 --------------------编程问答-------------------- 程序里面的socketip变量是全局变量吧
--------------------编程问答-------------------- 你最好将RecMsg()
放在一个新的线程里执行,并将套接字传递给它,而不是把套接字放在集合里  --------------------编程问答-------------------- socketip变量是全局变量的 --------------------编程问答-------------------- 为了实现功能,最直接就是重新new一个 --------------------编程问答-------------------- 应该这样才对,上代码吧
/// <summary>
        /// 监听客户端请求的方法;
        /// </summary>
        public void WatchConnecting()
        {
            while (true)  // 持续不断的监听客户端的连接请求;
              {
                try
                {  
                    Socket socket = _tcpListener.Accept();//接收客户端的连接

                    int receiveCount = 0;
                    while (receiveCount < byteLength)
                    {
                        int iTemp = socket.Receive(buff, receiveCount, byteLength - receiveCount, SocketFlags.None);//接收数据
                        if (iTemp == 0) break;
                        receiveCount += iTemp;
                    }

                    Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
                    receiveThread.IsBackground = true;
                    receiveThread.Start(buff);

                    try
                    {
                        //关闭连接
                        socket.Shutdown(SocketShutdown.Both);
                        if (socket.Connected)
                        {
                            socket.Close();
                        }
                    }
                    catch { }
                }
                catch{}                                       
            }        
        }


ReceiveWorkThread中再去处理你收到的内容。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,