【问题标题】:Get all bytes from stream从流中获取所有字节
【发布时间】:2014-06-24 05:56:43
【问题描述】:

我正在用 c# 编写一个代理,我编写了这个方法来从流中获取字节,但是在查看了这个线程中的答案之后:Proxy won't work in chrome and only partly in firefox 我意识到我没有得到所有的字节。我该如何解决这个问题?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace LexProxy
{
    class ProxyServer
    {
        private TcpListener tcpListener;

        public ProxyServer()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 3000);
            this.tcpListener.Start();
            while (true)
            {
                Console.Write("Waiting for a connection... ");
                TcpClient client = tcpListener.AcceptTcpClient();
                Thread thread = new Thread(delegate()
                {
                    Serve(client);
                });
                thread.Start();
            }
        }

        private void Serve(TcpClient client)
        {
            Console.WriteLine("Connected!");
            NetworkStream stream = client.GetStream();
            byte[] request = GetBytesFromStream(stream, client.ReceiveBufferSize);
            if (request != null)
            {
                string requestString = System.Text.Encoding.UTF8.GetString(request);
                string[] requestParts = requestString.Split(' ');
                if (requestParts.Length >= 2)
                {
                    string method = requestParts[0];
                    if (!requestParts[1].Contains("http://") && !requestParts[1].Contains("https://"))
                        requestParts[1] = "http://" + requestParts[1];

                    Uri uri = new Uri(requestParts[1], UriKind.RelativeOrAbsolute);
                    string host = StringUtils.ReplaceFirst(uri.Host, "www.", "");
                    int port = uri.Port;
                    byte[] response = getResponse(host, port, request);
                    if (response != null)
                        stream.Write(response, 0, response.Length);
                    client.Close();
                }
            }
        }

        private byte[] getResponse(string host, int port, byte[] request)
        {
            TcpClient client = new TcpClient(host, port);
            NetworkStream stream = client.GetStream();
            stream.Write(request, 0, request.Length);
            byte[] response = GetBytesFromStream(stream, client.ReceiveBufferSize);
            return response;
        }

        private byte[] GetBytesFromStream(NetworkStream stream, int bufferSize)
        {
            Byte[] bytes = new Byte[bufferSize];
            int i;
            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                return bytes;
            }

            return null;
        }
    }
}

【问题讨论】:

    标签: c# sockets http tcp


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      你做错了。与其在向下游发送之前尝试收集整个响应,不如在它们到达时复制字节。无需增加延迟。

      但请注意,您在 getAllBytesFromStream() 中编写的代码是无稽之谈。您有一个带有无条件返回语句的 while 循环。怎么会执行不止一次?

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 2015-05-17
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多