在asp网站上实现传输数据、下载数据接口,采用socket+xml方式进行数据传输的接口。我在服务器端收到客户端的信息后发送数据,这个时候sockeet是为null的,可能是响应了发送按钮事件页面刷新或者是socket连接后关闭。我想在发送数据的时候socket有对应的值,可以发送到客户端。有些急,希望知道的朋友能够帮忙!
我服务器端的代码是:
 private void StartServerListenAndReceiveData()
        {
            try
            {
                //如果没有绑定则执行绑定当地终结点操作
                if (!ServerSocket.IsBound)
                {
                    //设置终结点
                    SetEndPoint();                    ServerSocket.Bind(ServerEndPoint);
                  
                   //开启监听
                    ServerSocket.Listen(20);                    listBox1.Items.Add(string.Format("成功开启监听({0}:{1})[{2}]", ServerEndPoint.Address, ServerEndPoint.Port, DateTime.Now.ToString()));                    ClientSocket = ServerSocket.Accept();
                    //txtclient.Text = ClientSocket.ToString();
                }                //接收数据开始
                ServerReceiveData();
            }
            catch
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script type='text/javascript' language='javascript' defer='defer'>alert('" + "开启监听" + ServerEndPoint.Address + ":" + ServerEndPoint.Port + "失败!请检查服务端IP地址是否配置正确。" + "');</script>");
            }
        }        /// <summary>
        /// 线程监听操作
        /// </summary>
        private void ThreadServerListen()
        {
            //接收数据线程
            Thread ReceiveThread = new Thread(new ThreadStart(StartServerListenAndReceiveData));            //后台运行
            ReceiveThread.IsBackground = true;            //开启线程
            ReceiveThread.Start();
        }        /// <summary>
        /// 接收数据
        /// </summary>
        private void ServerReceiveData()
        {
            try
            {
                while (true)
                {
                    Thread.Sleep(1);
                    byte[] bytes = new byte[ClientSocket.Available];                    //接收数据
                    int butter = ClientSocket.Receive(bytes);                    if (butter > 0)
                    {
                        string strData = string.Format("{0}", Encoding.UTF8.GetString(bytes));//Encoding类中获取UTF8编码对象来进行编码转换,GetString从一个字节序列返回字符串,由此是用所选择的编码方式对字节序列进行解码。
                        listBox1.Items.Add(string.Format("[{0}][{1}]", ((IPEndPoint)ClientSocket.RemoteEndPoint).Address, DateTime.Now.ToString()));
                        listBox1.Items.Add(string.Format("  {0}", strData));
                        listBox1.SelectedIndex = listBox1.Items.Count - 1;
                    }                    //客户端SOCKET
                    ClientSocket = ServerSocket.Accept();
                }
            }
            catch (Exception err)
            {
                throw err;
            }
        }
        #endregion        #region Client        /// <summary>
        /// 线程发送数据
        /// </summary>
        private void ThreadClientrSendData()
        {
            Thread thread = new Thread(new ThreadStart(ClientSendData));
            thread.IsBackground = true;
            thread.Priority = ThreadPriority.Highest;
            thread.Start();
        }        /// <summary>
        /// 发送数据
        /// </summary>
        private void ClientSendData()
        {
            if (string.IsNullOrEmpty(txtContent.Text.Trim()))
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script type='text/javascript' language='javascript' defer='defer'>alert('" + "请填写发送信息" + "');</script>");
                txtContent.Focus();
                return;
            }
            try
            {
                if (ClientSocket == null)
                {
                    //Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script type='text/javascript' language='javascript' defer='defer'>alert('" + "没有可用连接。" + "');</script>");
                    return;
                }                btnClientSend.Enabled = false;
                btnClientSend.Text = "发送中...";
                byte[] bytes = null;                bytes = Encoding.UTF8.GetBytes(txtContent.Text.Trim());                //重新调整客户端端口号
                ClientEndPoint = (IPEndPoint)ClientSocket.RemoteEndPoint;
                ClientEndPoint = new IPEndPoint(ClientEndPoint.Address, CLIENT_END_POINT_PORT);                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                socket.Connect(ClientEndPoint);                //向客户端发送数据
                socket.Send(bytes);
                socket.Close();                listBox1.Items.Add(string.Format("[{0}][{1}]", ((IPEndPoint)ServerSocket.LocalEndPoint).Address, DateTime.Now.ToString()));                listBox1.Items.Add(string.Format("  {0}", txtContent.Text.Trim()));
                listBox1.SelectedIndex = listBox1.Items.Count - 1;                btnClientSend.Enabled = true;
                btnClientSend.Text = "发送";                txtContent.Text = "";
                txtContent.Focus();
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }
        //发送数据
  public void btnClientSend_Click(object sender, EventArgs e)
        {
            ThreadClientrSendData();
        }

解决方案 »

  1.   

    我觉得放在页面不行,状态保存不住你可以放在:Global.asax的
    /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Application_Start(object sender, EventArgs e)
        {
            // 这里你启动一个线程或计时器什么来永久保持socket的状态
        }
      

  2.   

    应该是在Global.asax中配置socket,可是我不知道怎么配置,头一回做这个。