none
HttpWebRequest.GetRequestStream()报错:{无法访问远程服务器} RRS feed

  • 问题

  • 问题描述:

    在本机上可以收发数据,但是在局域网的两台办公电脑间访问出错,{无法访问远程服务器};

    ps:防火墙已直接关闭,netsh http add urlacl url=http://xx.xx.xx.xx:23456/ user=everyone;

    使用telnet时 只能成功获取目标服务器80端口的信息,其他端口全部超时失败。

    感谢您的任何关注与建议。

    服务器端:

    执行

    Thread clienttest = new Thread(client);
                clienttest.Start();
    
     static void server()
            {
                HttpServerHelper.getInstance().Start("10.204.75.36", 23456);
            }

    源码:

    namespace CodeTestByMainMethod
    {
        class HttpServerHelper: IDisposable
    {
        private readonly HttpListener _listener;//监听
        private readonly Thread _listenerThread;
        private readonly Thread[] _workers;//工作线程组
        private readonly ManualResetEvent _stop, _ready;
        private Queue<HttpListenerContext> _queue;//消息队列
    
    
        private static HttpServerHelper instance;
        private static object _lock = new object();
        public static HttpServerHelper getInstance() {
            if (instance == null)
            {
                lock (_lock)
                {
                    if (instance == null)
                    {
                        instance = new HttpServerHelper(10);
                    }
                }
            }
            return instance;
        }
        
    
        private HttpServerHelper(int maxThreads)//初始化确定最大线程数
        {
            _workers = new Thread[maxThreads];
            _queue = new Queue<HttpListenerContext>();
            _stop = new ManualResetEvent(false);
            _ready = new ManualResetEvent(false);
            _listener = new HttpListener();
            _listenerThread = new Thread(HandleRequests);//C#中用函数做参数初始化线程
        }
    
        public void Start(String ip,int port)
        {
            //_listener.Prefixes.Add(String.Format(@"http://+:{0}/", port));//添加监听的地址,可以是string[]
            _listener.Prefixes.Add("http://"+ip+":"+port+"/");//添加监听的地址,可以是string[]
            _listener.Start();
            _listenerThread.Start();
    
            for (int i = 0; i < _workers.Length; i++)
            {
                _workers[i] = new Thread(Worker);
                _workers[i].Start();
            }
        }
    
        public void Dispose()
        { Stop(); }
    
        public void Stop()//这里是关闭线程,Join方法比较迷
        {
            _stop.Set();
            _listenerThread.Join();
            foreach (Thread worker in _workers)
                worker.Join();
            _listener.Stop();
        }
    
        private void HandleRequests()
        {
            while (_listener.IsListening)
            {
                var context = _listener.BeginGetContext(ContextReady, null);
    
                if (0 == WaitHandle.WaitAny(new[] { _stop, context.AsyncWaitHandle }))//跳出监听
                    return;
            }
        }
    
        private void ContextReady(IAsyncResult ar)
        {
            try
            {
                lock (_queue)
                {
                    _queue.Enqueue(_listener.EndGetContext(ar));
                    _ready.Set();//通知workers
                }
            }
            catch { return; }
        }
    
        private void Worker()
        {
    }
    }

    client端收发内容

    Thread clienttest = new Thread(client); clienttest.Start(); static void client() { HttpClientHelper myhelper = new HttpClientHelper();

    myhelper.HttpPost("http://10.204.75.36:23456/", "");

    具体内容

    public string HttpPost(string Url, string postDataStr)
            {
                _clientCounter += 1;
                var tmpClientCount = _clientCounter;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                //request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
                //request.CookieContainer = cookie;
                Stream myRequestStream = request.GetRequestStream();
    }



    TFS C#开发不动人员 这个职业不广泛

    2015年8月28日 5:34

答案

  • 问题描述:

    在本机上可以收发数据,但是在局域网的两台办公电脑间访问出错,{无法访问远程服务器};

    ps:防火墙已直接关闭,netsh http add urlacl url=http://xx.xx.xx.xx:23456/ user=everyone;

    使用telnet时 只能成功获取目标服务器80端口的信息,其他端口全部超时失败。

    看看有没有可能是局域网防火墙设置导致无法连接到特定的端口号
    • 已标记为答案 Allen WOE 2015年8月31日 5:25
    2015年8月31日 2:15

全部回复

  • 问题描述:

    在本机上可以收发数据,但是在局域网的两台办公电脑间访问出错,{无法访问远程服务器};

    ps:防火墙已直接关闭,netsh http add urlacl url=http://xx.xx.xx.xx:23456/ user=everyone;

    使用telnet时 只能成功获取目标服务器80端口的信息,其他端口全部超时失败。

    看看有没有可能是局域网防火墙设置导致无法连接到特定的端口号
    • 已标记为答案 Allen WOE 2015年8月31日 5:25
    2015年8月31日 2:15
  • 谢谢 您的回复,的确应该是网络向问题;上周折磨我两天,今天突然好了。

    TFS C#开发不动人员 这个职业不广泛

    2015年8月31日 5:25