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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。