private const int OutTimeConn = 10000; //连接时间超时  5秒

        public BaseResponse SendMessage(BaseRequest bmr, string WebsiteCode, string TellerCode)
        {
            TimeoutObject.Reset();
            BaseResponse result = null;

            _socket.BeginConnect(new IPEndPoint(IPAddress.Parse(RemoteIP), RemotePort), delegate(IAsyncResult ar) { TimeoutObject.Set(); }, _socket);
            if (TimeoutObject.WaitOne(OutTimeConn, false))
            {
                _socket.ReceiveTimeout = OutTime;
                _socket.SendTimeout    = OutTime;
                string str = bmr.ObjectToMessage();
                _socket.Send(Encod.GetBytes(str));
                len = _socket.Receive(buffer);

                if (len > 0)
                {
                    string strbuff = Encod.GetString(buffer);
                    switch (bmr.BusinessCode)
                    {
                    case "01": result = new Response01(buffer); break;

                    case "02": result = new Response02(buffer); break;

                    case "03": result = new Response03(buffer); break;

                    case "04": result = new Response04(buffer); break;

                    case "05": result = new Response05(buffer); break;

                    case "06": result = new Response06(buffer); break;

                    case "07": result = new Response07(buffer); break;

                    case "08": result = new Response08(buffer); break;

                    case "09": result = new Response09(buffer); break;

                    default: return(null);
                    }
                }
                bmr.SaveMessage(WebsiteCode, TellerCode);
                if (result != null)
                {
                    result.BankCode = bmr.BankCode;
                    result.SaveMessage(WebsiteCode, TellerCode);
                }
                return(result);
            }
            else
            {
                if (_socket.Connected)
                {
                    _socket.Shutdown(SocketShutdown.Both);
                    _socket.Close();
                }
                throw new Exception("所提供的服务器连接超时");
            }
        }
Example #2
0
        /// <summary>
        /// HttpPost方法
        /// </summary>
        /// <param name="Address">请求的地址(IP:端口)</param>
        /// <param name="method">方法名称</param>
        /// <param name="strPost">请求数据</param>
        /// <param name="dtStr">请求时间</param>
        /// <param name="Conifg">配置名</param>
        /// <param name="i">第几次请求</param>
        /// <param name="RecvTimeOut">返回超时</param>
        /// <param name="ReqTimeout">请求超时</param>
        /// <returns>返回数据</returns>
        public static string HttpPost(string Address, string method, string strPost, string dtStr, string Conifg = "", int i = 0, int RecvTimeOut = 3000, int ReqTimeout = 1000)
        {
            string innerErrorMessage = string.Empty;

            string data   = string.Empty;
            Socket socket = null;

            try
            {
                string[] strAddress = Address.Split(':');

                TimeoutObject.Reset();

                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                IPAddress ip = IPAddress.Parse(strAddress[0]);

                byte[] postBytes = Encoding.ASCII.GetBytes(UrlEncodeGB2312(strPost));

                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("POST /format=json&language=CSharp&method={0}{1} HTTP/1.1\r\n", method, string.IsNullOrEmpty(Conifg) ? string.Empty : string.Format("&USING={0}", Conifg));
                sb.Append("Content-Type: application/x-www-form-urlencoded\r\n");
                sb.AppendFormat("Host: {0}\r\n", Address);
                sb.AppendFormat("Content-Length: {0}\r\n", postBytes.Length);
                sb.Append("Connection: Keep-Alive\r\n\r\n");

                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, RecvTimeOut);

                socket.BeginConnect(new IPEndPoint(ip, Convert.ToInt32(strAddress[1])), CallBackMethod, socket);

                //阻塞当前线程
                if (!TimeoutObject.WaitOne(ReqTimeout, false))
                {
                    //连接超时
                    return(string.Empty);
                }

                byte[] sendData = Encoding.ASCII.GetBytes(UrlEncodeGB2312(sb.ToString()));

                byte[] nCon = new byte[sendData.Length + postBytes.Length];
                sendData.CopyTo(nCon, 0);
                postBytes.CopyTo(nCon, sendData.Length);

                socket.Send(nCon);

                byte[] recive = new byte[40960];

                int nlen   = 0;
                int ntotal = 0;
                System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"(?<=Content-Length:)\d{1,8}");

                while (true)
                {
                    int nrec = socket.Receive(recive);
                    if (nrec == 0)
                    {
                        break;
                    }
                    ntotal += nrec;
                    string header = Encoding.Default.GetString(recive);
                    if (nlen == 0)
                    {
                        System.Text.RegularExpressions.Match match = reg.Match(header);
                        if (match.Success)
                        {
                            nlen = Convert.ToInt32(match.Value);
                        }
                    }
                    data += header;
                    int npos = data.IndexOf("\r\n\r\n");
                    if (npos != -1)
                    {
                        data = data.Substring(npos + 4);
                    }
                    if (ntotal - 78 - nlen.ToString().Length >= nlen)
                    {
                        break;
                    }
                }

                socket.Shutdown(SocketShutdown.Both);
            }
            catch (Exception ex)
            {
                innerErrorMessage = string.Format("JetermClient.{0}的HttpPost{1}请求抛异常:{2}请求时间:{3}{2}请求EtermServer服务器地址:{4}{2}请求数据:{2}{5}{2}返回:{2}{6}{2}异常信息为:{2}{7}", method, (i > 0 ? string.Format("第{0}次", i) : string.Empty), Environment.NewLine, dtStr, Address, strPost, (string.IsNullOrWhiteSpace(data) ? "返回为空" : data), ex.ToString());
                log.Error(innerErrorMessage);
            }
            finally
            {
                if (socket != null)
                {
                    socket.Close();
                }
            }

            if (!string.IsNullOrWhiteSpace(innerErrorMessage))
            {
                throw new Exception(innerErrorMessage);
            }
            return(data);
        }