kangjiwww 2018-05-27 09:44 采纳率: 0%
浏览 2023
已结题

C# Socket服务器接收HTTP请求,不能全部做出响应

使用Socket作为服务器,接收HTTP请求,在Socket socket = socketListen.Accept();之后启动一个线程处理接收数据
和发送数据,如果不调用socket.Receive(data);接收客户数据的话,那么客户端(也就是HTTP请求)请求多少次,
服务端的Socket socket = socketListen.Accept();就会被调用多少次,就是能百分百接收到客户端请求,
但是通过socket.Send(head)作为HTTP请求返回数据,HTTP请求那边几乎获取不到返回的数据,
偶尔还是能获取到的,相反,不调用socket.Receive(data);方法,就会出现 比如 HTTP请求了100次, socketListen.Accept();可能就被执行了80次,但是这80次调用socket.Send(head)返回给http的数据,http那边都能获取到服务端返回的数据,注:客户端每次发送的数据很少,代码如下public partial class MainWindow : Window
{
private Socket socketWatch;
private Thread listenThread = null;
private bool isRun = false;
private int pointer = 0;
public MainWindow()
{
InitializeComponent();
init();
}

    private void init()
    {
        socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));
        socketWatch.Listen(10); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的
        listenThread = new Thread(new ParameterizedThreadStart(run));
        listenThread.IsBackground = true;

    }

    private void run(Object o)
    {
        Socket socketListen = (Socket)o;
        while (isRun)
        {
            Socket socket = socketListen.Accept();
            pointer = pointer + 1;
            Thread thread = new Thread(new ParameterizedThreadStart(task));
            thread.IsBackground = true;
            thread.Start(socket);
        }
    }



    private void bn_start_Click(object sender, RoutedEventArgs e)
    {
        isRun = true;
        bn_start.IsEnabled = false;
        bn_stop.IsEnabled = true;
        listenThread.Start(socketWatch);
    }

    private void bn_stop_Click(object sender, RoutedEventArgs e)
    {
        System.Environment.Exit(0);
    }

    private void Window_Closed(object sender, EventArgs e)
    {
        System.Environment.Exit(0);
    }



    private void task(object o)
    {
        Socket socket = (Socket)o;


        byte[] data = new byte[1024 * 2]; // 浏览器发来的数据
        int reciverNumber = socket.Receive(data);

        string resdata = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "  server request time:" + pointer;
        byte[] body = Encoding.UTF8.GetBytes(resdata);
        byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK

Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server

" + resdata);
socket.Send(head);
socket.Shutdown(SocketShutdown.Both);
socket.Close();

    }     
}

  • 写回答

3条回答 默认 最新

  • kangjiwww 2018-05-27 10:04
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?