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 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号